王朝网络
分享
 
 
 

ADOCE与ADO.NET的差异

王朝c#·作者佚名  2008-05-21
宽屏版  字体: |||超大  

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

本文需要:

· 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代码。

数据访问

大部分企业应用程序都是以数据为中心的,这意味着你需要知道如何储存信息。我的爱好是存储数据,当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进行比较。

主要差异

好了,让我们来首先大概地看一下重要的差别。下面是一个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提供了什么。他们的Cefusion和ViaXML产品在这里都是有用的。如果你在寻找更长远(读Microsoft .NET)的方法来转换数据,你应该看一下pocketSOAP。

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

读取数据

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

Dim litm As ListItemDim laco As ConnectionDim lars As RecordsetDim lsSQL As String' Add column headerslvwArticles.ColumnHeaders.Add , , "Description", 2500lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRightlvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight' Create objectsSet laco = CreateObject("ADODB.Connection")Set lars = CreateObject("ADODB.Recordset")' Open Connectionlaco.Open "Provider=SQLOLEDB;Data Source=SERVERNAME;" & _"Initial Catalog=DBNAME;Trusted_Connection=Yes"' Open RecordsetlsSQL = "SELECT * FROM Article"lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly' Clear list and get item rowsDo While Not lars.EOFSet litm = lvwArticles.ListItems.Add(, , lars("Description").Value)litm.SubItems(1) = lars("Price").Valuelitm.SubItems(2) = lars("Stock").Valuelars.MoveNextLoop' Close Recordset and Connectionlars.Closelaco.Close

你在Pocket PC上将这样做:

Dim litm As ListItemDim laco As ConnectionDim lars As RecordsetDim lsSQL As String' Add column headerslvwArticles.ColumnHeaders.Add , , "Description", 2500lvwArticles.ColumnHeaders.Add , , "Price", 600, lvwColumnRightlvwArticles.ColumnHeaders.Add , , "Stock", 600, lvwColumnRight' Create objectsSet laco = CreateObject("ADOCE.Connection.3.1")Set lars = CreateObject("ADOCE.Recordset.3.1")' Open Connectionlaco.Open "Provider=Microsoft.SQLSERVER.OLEDB.CE.1.0;" & _"Data Source=DBNAME.sdf"' Open RecordsetlsSQL = "SELECT * FROM Article"lars.Open lsSQL, laco, adOpenForwardOnly, adLockReadOnly' Clear list and get item rowsDo While Not lars.EOFSet litm = lvwArticles.ListItems.Add(, , lars("Description").Value)litm.SubItems(1) = lars("Price").Valuelitm.SubItems(2) = lars("Stock").Valuelars.MoveNextLoop' Close Recordset and Connectionlars.Closelaco.Close

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

结论

(a)所有的数据访问代码几乎不需要修改就可以被使用并且

(b)大多数你的PC程序数据访问代码得到数据,你会认识到将你PC应用程序移植到Pocket PC上不需要巨大的努力。

更新数据

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

' Open RecordsetlsSQL = "SELECT * FROM Article"lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic' Add new Articlelars.AddNewlars("Description").Value = "Test"lars("Price").Value = 50lars("Stock").Value = 100lars.Update而在Pocket PC上你将看到这样的代码:' Open RecordsetlsTable = "Article"lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _adCmdTableDirect' Add new Articlelars.AddNewlars("Description").Value = "Test"lars("Price").Value = 50lars("Stock").Value = 100lars.Update

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

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

' Open RecordsetlsSQL = "SELECT * FROM Article WHERE Description='Test'"lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic' Update ArticleIf Not lars.EOF Thenlars("Price").Value = 200lars.UpdateEnd If这是Pocket PC上的:' Open RecordsetlsTable = "Article"lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _adCmdTableDirectlars.Find "Description='Test'"' Update ArticleIf Not lars.EOF Thenlars("Price").Value = 200lars.UpdateEnd If

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

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

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

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

' Open RecordsetlsSQL = "SELECT * FROM Article WHERE Description='Test'"lars.Open lsSQL, laco, adOpenDynamic, adLockOptimistic' Delete ArticleIf Not lars.EOF Then lars.DeletePocket PC上相应的代码:' Open RecordsetlsTable = "Article"lars.Open lsTable, laco, adOpenDynamic, adLockOptimistic, _adCmdTableDirectlars.Find "Description='Test'"' Delete ArticleIf Not lars.EOF Then lars.Delete

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

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

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

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

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

结束

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有