ADOCE for ADO Programmers

原创 2003年02月17日 11:04:00

 

ADOCE for ADO Programmers<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

老狼按:最近在做Pocket PC上的数据库开发,这篇文章给了我许多帮助,所以我才把它翻译出来,希望给大家一些帮助。

你是一个需要将自己的知识和代码从PC移植到Pocket PC上的ADO开发者吗?我将通过一些代码实例来向您展示ADOADOCE之间的相似和不同之处。

Download the 619-CF.exe from the MSDN Code Center.

What You Need

·                     Microsoft® eMbedded Visual Tools.

·                     Microsoft SQL Server 2000 Developer Edition.

·                     SQL Server 2000 Windows® CE Edition.

·                     Microsoft ADOCE (ActiveX® Data Objects CE) 3.1 included with SQL Server 2000 Windows CE Edition.

·                     To try the server-side examples, you need Microsoft Visual Studio® and ADO 2.6.

Gotchas

因为在CreateObject声明中有一处内存漏洞,所以你最好在你的程序中只创建ADOCE对象一次。在实例代码中,我将CreateObject的调用放到了每一个事件过程中,但是那只是为了比较ADO代码。

Languages Supported

English

Data Access

数据访问

大部分企业应用程序都是以数据为中心的,这意味着你需要知道如何储存信息。我的爱好是存储数据,当Pocket PC上使用的是真正的数据库——SQL Server 2000 Windows CE Edition因此,我的第一个建议是得到你所需要的一个SQL Server 2000 Developer Edition的许可。

当你安装了SQL Server 2000 Windows CE Edition后,你将同时得到ADOCE 3.1,最新的版本。我将用它和PC上最新版的ADO 2.6进行比较。

Main Differences

主要差异

好了,让我们来首先大概地看一下重要的差别。下面是一个ADOCE不支持的ADO功能列表:

·                     Command and Parameter objects

·                     Collection objects

·                     Property object

·                     Recordset persistence (Recordset.Save)

·                     Asynchronous queries

·                     Disconnected Recordsets

·                     Dynamic creation of Recordsets

·                     Multiple queries (Recordset.NextRecordset)

对于我来说,没有的Recordset persistence意味着我不能将结果集存成Extensible Markup Language (XML)来供Pocket PC上的其他程序来调用。也许更重要的是,我不能将XML数据存入我的结果集中了。这造成了我需要进行从服务器组件中到Pocket PC上的数据转化或者相反——我也需要一些转化。我的建议是看一下Odyssey Software提供了什么。他们的CefusionViaXML产品在这里都是有用的。如果你在寻找更长远(读Microsoft .NET)的方法来转换数据,你应该看一下pocketSOAP

无论如何,大多数重要的功能在ADOCE中被实现了。现在我们来看一下在相同的数据访问环境中的一些差异。

Data Retrieval

数据获取

让我们用最常见的设想来开始——当你需要从一个数据存储中得到一些信息。在PC上,填写ListView控件的数据获取代码将会这么写:

Dim litm As ListItem

Dim laco As Connection

Dim lars As Recordset

Dim lsSQL As String

 

  ' Add column headers

lvwArticles.ColumnHeaders.Add , , "Description", 2500

lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRight

lvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight

 

' Create objects

Set laco = CreateObject("ADODB.Connection")

Set lars = CreateObject("ADODB.Recordset")

 

' Open Connection

laco.Open "Provider=SQLOLEDB;Data Source=SERVERNAME;" & _

          "Initial Catalog=DBNAME;Trusted_Connection=Yes"

 

' Open Recordset

lsSQL = "SELECT * FROM Article"

lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly

 

' Clear list and get item rows

Do While Not lars.EOF

  Set litm = lvwArticles.ListItems.Add(, , lars("Description").Value)

    litm.SubItems(1) = lars("Price").Value

    litm.SubItems(2) = lars("Stock").Value

  lars.MoveNext

Loop

  

' Close Recordset and Connection

lars.Close

laco.Close

你在Pocket PC上将这样做:

Dim litm As ListItem

Dim laco As Connection

Dim lars As Recordset

Dim lsSQL As String

 

' Add column headers

lvwArticles.ColumnHeaders.Add , , "Description", 2500

lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRight

lvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight

 

' Create objects

Set laco = CreateObject("ADOCE.Connection.3.1")

Set lars = CreateObject("ADOCE.Recordset.3.1")

 

' Open Connection

laco.Open "Provider=Microsoft.SQLSERVER.OLEDB.CE.1.0;" & _

          "Data Source=/DBNAME.sdf"

 

' Open Recordset

lsSQL = "SELECT * FROM Article"

lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly

 

' Clear list and get item rows

Do While Not lars.EOF

  Set litm = lvwArticles.ListItems.Add(, , lars("Description").Value)

    litm.SubItems(1) = lars("Price").Value

    litm.SubItems(2) = lars("Stock").Value

  lars.MoveNext

Loop

  

' Close Recordset and Connection

lars.Close

laco.Close

正如你看到的,在两个例子中有一些较小的差别。比较明显的是Connection对象的Open方法的连接字符串不同。如果你忽略Provider参数,ADOCE将假设你想访问一个Pocket Access数据库文件。而SQL Server CE始终是作为一个文件名被引用。这种情况下,文件将被放置到设备的根目录下,但是也可以被放置在你的应用程序目录中(例如,Data Source=/Program Files/AppName/AppName.sdf)。

万事具备。结论(a)所有的数据访问代码几乎不需要修改就可以被使用并且(b)大多数你的PC程序数据访问代码得到数据,你会认识到将你PC应用程序移植到Pocket PC上不需要巨大的努力。

Updating Data

更新数据

现在,让我们看一下另外一个假设——当我们需要添加一些信息到数据存储。我将使用和数据获取相同的代码来打开和关闭Connection Recordset对象。在PC上你将写类似的代码:

' Open Recordset

lsSQL = "SELECT * FROM Article"

lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic

  

' Add new Article

lars.AddNew

lars("Description").Value = "Test"

lars("Price").Value = 50

lars("Stock").Value = 100

lars.Update

而在Pocket PC上你将看到这样的代码:

' Open Recordset

lsTable = "Article"

lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _

                         adCmdTableDirect

  

' Add new Article

lars.AddNew

lars("Description").Value = "Test"

lars("Price").Value = 50

lars("Stock").Value = 100

lars.Update

正如你看到的,不同之处在于你打开Recordset的方法。作为更新,Recordset作为一个表被打开比作为一个SQL声明(SELECT)更好。你也许在PC上(ADO)做的很好,但是这一点大概是你将代码从PC移植到Pocket PC上时不得不改变的。

让我们来看一个更新的状况。这是PC上的代码:

' Open Recordset

lsSQL = "SELECT * FROM Article WHERE Description='Test'"

lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic

  

' Update Article

If Not lars.EOF Then

  lars("Price").Value = 200

  lars.Update

End If

这是Pocket PC上的:

' Open Recordset

lsTable = "Article"

lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _

                         adCmdTableDirect

lars.Find "Description='Test'"

  

' Update Article

If Not lars.EOF Then

  lars("Price").Value = 200

  lars.Update

End If

像在PC上一样用SQL声明(SELECT)来创建一个可更新Recordset是不可能的,你可以使用Find方法得到Recordset中想要的位置。

如果你像加强一些性能,你可以用一个"raw" SQL UPDATE statement来做相同的事情:

laco.Execute "UPDATE Article SET Price=200 WHERE Description='Test'"

为了完善设想,我们来看一下如何删除数据。在PC上,代码是这样的:

' Open Recordset

lsSQL = "SELECT * FROM Article WHERE Description='Test'"

lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic

  

' Delete Article

If Not lars.EOF Then lars.Delete

Pocket PC上相应的代码:

' Open Recordset

lsTable = "Article"

lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _

                         adCmdTableDirect

lars.Find "Description='Test'"

  

' Delete Article

If Not lars.EOF Then lars.Delete

这里和更新的代码非常像。请注意Find方法的结果集是一个只包含与搜索标准相匹配记录的Recordset。这意味着你在PCPocket PC中会得到相同内容的Recordset。我说这个,是为了防止你想对Pocket PC上的Recordset做更多的事情,因为你打开了相同的表。

此外,你可以用一个SQL DELETE语句来做几乎相同的事情:

laco.Execute "DELETE Article WHERE Description='Test'"

我说“几乎”,是因为最后的Execute将会删除所有与查询条件匹配的记录,但是上面的只会删除第一条出现的记录。在实际的情况中,搜索比较也许会被设定为唯一的键来产生出相同的结果。

完整的例子,请看例子的代码。

Conclusion

结束

你已经知道了大多数关于PC上的ADO可以被用在你的Pocket PC上的事情,即使一些事情的处理方式略有不同。同样,在写Pocket PC程序时,大部分数据访问代码都可以通过一些改动应用到你的程序中去。

你今天为什么不开始将一个PC上的企业级程序移植到Pocket PC上去?马上开始,然后向别人展示——这将是你下一个工程。

欢迎访问aawolf的专栏:http://www.csdn.net/develop/author/netauthor/aawolf/

Shaders for Game Programmers and Artists(目录)

  确定一个目标:实现我们教师的TSM算法,所以学习HLSL先打算用这本书+RenderMonkey来学习,先熟悉一下整本书的内容:Part I 从头开始. . . . . . . . . . . ....
  • xoyojank
  • xoyojank
  • 2007年09月12日 03:03
  • 3177

《UML for Java Programmers》记

 1 当你做图的时候能够想象到你的代码是极其重要的。我们把图当作了解代码的一条捷径,并不是替代代码。如果你画着图但是不能想像出它代表着什么样的代码,你是正在空气中建筑着城堡。停下来你正在做的,想想如何...
  • arkblue
  • arkblue
  • 2009年11月28日 09:55
  • 819

JUnit之走马观花篇(转)

出处 JWT 李巍(outmyth) 译 选自:中文JAVA网站【译者注】本文译自JUnit3.8.1发布版本中JUnit A Cooks Tour一文。1.简介在一篇早些的文章(请参见Test In...
  • myali88
  • myali88
  • 2005年04月08日 09:16
  • 1446

Codeforces Round #302 (Div. 2) C dp(背包思想)

链接:戳这里 C. Writing Code time limit per test3 seconds memory limit per test256 megabytes i...
  • libin66
  • libin66
  • 2016年07月24日 13:00
  • 361

Java.9.Programming

Packt.Java.9.Programming.Blueprints.178646019X.epub Prentice.Hall.Java.9.for.Programmers.4th.Editio...
  • Cloud_Strife_1985
  • Cloud_Strife_1985
  • 2017年07月31日 22:59
  • 187

关于程序员面试

列举一些程序员面试笔试的书籍,我个人觉得看完这些书,进入百度,阿里巴巴,腾讯应该很有把握,大家一起学习 编程之法:面试和算法心得 算法的乐趣 微软面试100题系列(by_July) 挑战程序设计竞赛 ...
  • qq_23225317
  • qq_23225317
  • 2016年10月07日 00:00
  • 258

Lisp的给力特性(V.S. Python3) 第二篇

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie腾讯微博 -- 讨论新闻组 -- 代码库 -- 豆瓣前一篇 在这里。Lisp特性列表表处...
  • vagrxie
  • vagrxie
  • 2010年12月24日 01:01
  • 7414

ZooKeeper Programmer's Guide(ZooKeeper 3.4 Documentation)个人翻译

前言: 个人从事大数据方面的开发多时,仗着大学英语还不错便经常查看apache官方文档。长久下来觉得应该利用自身的优势为英文水平不是很好但又超级聪明的中国程序员做点事情,故决心翻译最新的Zookee...
  • y81979914
  • y81979914
  • 2015年10月12日 16:33
  • 781

My new style

Many days ago I used the same structure to describe my life style, and I wonna want to change some w...
  • frontgoggle
  • frontgoggle
  • 2006年04月21日 22:10
  • 555

鲍勃大叔的组合拳——清华社[UML for Java Programmers]

2003-09-24 15:18:16 孟岩Robert C.Martin开始发力了。这件事情令我颇为欣喜,也颇为疑惑。号称鲍勃大叔的Martin,在面向对象开发领域素以经验丰富,一言九鼎著称。设计模...
  • nonocast
  • nonocast
  • 2005年04月16日 13:20
  • 2290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ADOCE for ADO Programmers
举报原因:
原因补充:

(最多只允许输入30个字)