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。这意味着你在PC和Pocket 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/
上一页 [1] [2] [系统软件]InstallShield Express for delphi制作安装程序定… [系统软件](转帖) 忘记登录密码的解决方案 for XP/2003/2000 [系统软件]交叉编译sshd for IXP425 ARM Platform by MVL 3… [Delphi程序]《关于VisiBroker For Delphi的使用》(4) [Delphi程序]一个超链接Image控件!(For D3,D4,D5,D6)源代码 [Delphi程序]Five of the best tools for Delphi [Delphi程序]《关于VisiBroker For Delphi的使用》(3) [Delphi程序]《关于VisiBroker For Delphi的使用》(2) [Delphi程序]《关于VisiBroker For Delphi的使用》 [Delphi程序]Delphi for .Net 编译器预览 - by John Kaster
|