栏目搜索
 
 
 
 
你的位置:首页 > 移动开发 > ADOCE与ADO.NET的差异 >
 

ADOCE与ADO.NET的差异

发布者:[本站编辑] | 来源:[]

ADOCE与ADO.NET的差异_电脑维修资料库

你是一个需要将自己的知识和代码从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 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上不需要巨大的努力。


  更新数据

  现在,让我们看一下另外一个假设——当我们需要添加一些信息到数据存储。我将使用和数据获取相同的代码来打开和关闭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。这意味着你在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上去?马上开始,然后向别人展示——这将是你下一个工程。


</t