扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Larry Roof 来源:MSDN 2007年9月1日
关键字: Pocket Access
移动开发意味着更多选择。拥有的选择越多,作为移动开发人员的您就会取得更大的成功。这里的选择,我指的是编程技术和技能。
对于数据存储,这更是如此。存储数据的方式通常是移动应用程序的基础。数据的存储方式通常会影响到它的传输方式和使用方式。
.NET Compact Framework 为移动开发人员提供了许多数据存储选择,包括文本和二进制文件(例如 XML)以及 SQL Server CE 数据库。乍一看,您可能会认为这已经足够了,但我说过,移动开发意味着更多选择。
.NET Compact Framework 缺少一种数据选择,那就是对 Pocket Access 数据库的支持。Pocket Access 是 Microsoft Access 的一个精简版。作为替代品,它被设计为一种简单小型的数据库。引擎(如果可以这样称呼)驻留在每个 Pocket PC 上。Pocket Access 为移动开发人员提供的内容有:
• |
一个对象模型 — ADOCE,它是 ADO 的 Windows CE 实现。 |
• |
一个 ActiveSync 组件,它使您可以从设备上复制数据库以及将数据库复制到设备。 |
• |
在数据库的不同设备版本之间保持同步的功能。 |
• |
一个小型桌面 API,它包含两个功能,可用来以编程方式在 PC 应用程序和设备之间互相复制表。 |
• |
存储数据的表。 |
ADOCE 是 ADO 的 Windows CE 实现。与 ADO 一样,它是作为对象模型实现的。问题在于,.NET Compact Framework 并不提供继承方法以便使用 COM 组件及其关联的对象模型。幸运的是,InTheHand Software (www.inthehand.com) 已经创建了一个 Adoce .NET 组件,该组件可为 NETCF 开发人员提供 ADOCE 功能。
注ADOCE NET Wrapper 演示版只限在 Pocket PC 模拟器中使用。
在可以使用 Adoce .Net 之前,您必须首先在项目中添加对命名空间的引用。要添加引用,请执行以下步骤:
1. |
在解决方案资源管理器窗口中,右键单击 References 文件夹。 |
2. |
从菜单中选择 Add Reference。 |
3. |
选择 InTheHand.AdoceNet 组件。 |
4. |
单击 OK 按钮,以将所选的组件添加到项目中。 |
AdoceNet 命名空间提供下列类:
类 | 描述 |
Connection |
表示到 Pocket Access 数据库的连接。 |
Error |
从提供程序返回错误信息。 |
ErrorCollection |
Error 项目集合。 |
Field |
记录中的一个字段。 |
FieldCollection |
记录中的字段集合。 |
Recordset |
一组记录。 |
在下面的部分中,我们将演练一些经常执行的与 ADOCE 相关的任务。
首先,使用 Connection 类建立一个到 Pocket Access 数据库的连接。这个操作通常分为三个步骤。首先,需要定义一个保存 Connection 对象的变量。
Dim cn As InTheHand.AdoceNet.Connection
其次,需要进行检查,以确保设备上安装有 ADOCE 3.1 版对象库。由于 Pocket PC 一开始就安装了这个库,所以通常不会有问题。
' Initialise the connection. Try cn = New InTheHand.AdoceNet.Connection Catch ex As TypeLoadException MsgBox("ADOCE 3.1 is not installed on your device. Application exiting.") Application.Exit() End Try
最后,可以使用 Connection 对象的 Open 方法来打开连接,如下所示:
' Connect to the database. cn.Open("\Windows\Start Menu\Programs\larryroof\nwind.cdb")
该连接用于检索来自数据库的记录,如下面的部分所要介绍的。
AdoceNet 命名空间中包含了 Recordset 类,该类提供了一个对象来保留一组记录。要打开和传播记录集,可以使用 Recordset 对象的 Open 方法。
Dim rs As New InTheHand.AdoceNet.Recordset rs.Open("SELECT * FROM Customers", cn)
Open 方法的第一个参数可以是一个 SQL 语句,也可以是要打开的表的名称。第二个参数是记录集用来访问数据库的连接。
通过记录集,您始终可以使用一个活动的记录 — 当前所指向的记录集中的记录。Recordset 对象提供了五种移动记录集的方法:
• |
MoveNext:移动到记录集中的下一个记录。 |
• |
MovePrevious:移动到记录集中的上一个记录。 |
• |
MoveFirst:移动到记录集中的第一个记录。 |
• |
MoveLast:移动到记录集中的最后一个记录。 |
• |
Move:移动到记录集中的特定记录。 |
注在使用 MoveNext 和 MovePrevious 方法时,需要确保没有超出记录集的开头或结尾。出于这个目的,Recordset 对象包含了两个属性(BOF 和 EOF),当您位于开头或结尾处时,它们会通知您。
向表中添加记录有两种方法 — SQL INSERT 语句和 Recordset 对象的 AddNew 方法。SQL INSERT 语句为首选方法,因为它是添加数据的最有效方法。
AddNew 方法用于在现有的记录集中添加记录。下面的代码片段演示了如何使用这个方法:
Dim rs As New InTheHand.AdoceNet.Recordset rs.AddNew rs.Fields("Name") = "Larry Roof" rs.Update
正如在上面的例子中看到的那样,调用 AddNew 方法仅仅是该过程的一部分。AddNew 只是在记录集中添加一个空白、全新的记录。然后,您必须传递字段并通过调用 Update 方法来完成。
有两种方法可以更新表。首选方法是使用 SQL UPDATE 语句。与 INSERT 语句一样,UPDATE 语句是修改数据的最有效方法。
第二个方法是使用 Recordset 对象的 Update 方法。下面的代码片段演示了如何使用这个方法:
Dim rs As New InTheHand.AdoceNet.Recordset rs.Fields("Name") = "Larry Roof" rs.Update
Update 方法用于修改活动记录。在执行上述步骤之前,可能需要使用一组基于 Recordset Move 的方法来定位到合适的记录。
有两种方法可以从表中删除记录。与前面的两个示例相同,首选方法是使用 SQL DELETE 语句,因为它是最有效的方法。
第二种方法是使用 Recordset 对象的 Delete 方法。下面的代码片段演示了如何使用这个方法:
Dim rs As New InTheHand.AdoceNet.Recordset rs.Delete rs.MoveNext If (rs.EOF) Then rs.MoveLast End If
在上面的例子中特别需要注意的是,在从一个记录集中删除记录之后,需要重新定位活动记录,并且在使用 MoveNext 或者 MovePrevious 方法时,应该始终检查以确保没有超出记录集的范围。
为了对 Pocket Access 的讨论进行总结,我提供了 Pocket Access Demo 应用程序(下载的链接位于本文开头处)。该应用程序演示了通过 .NET Compact Framework 使用 Pocket Access 数据库的各种技术。
该应用程序的界面分为两个部分 — 一个用于逐条记录地显示记录集,另一个在 DataGrid 控件中一次性显示整个记录集。图 1 显示了前一种,图 2 显示了后一种。
图 1. 逐条记录地显示记录集的 Pocket Access Demo 应用程序
图 2. 在 DataGrid 控件中显示整个记录集的 Pocket Access Demo 应用程序
当 Pocket Access Demo 应用程序开始运行后,它会同时传播记录和与数据一起显示的网格。这大多会发生在 Form 的 Load 事件中。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load ' Initialize the connection. Try cn = New InTheHand.AdoceNet.Connection Catch ex As TypeLoadException MessageBox.Show("ADOCE 3.1 is not installed on your device. " & _ "Application exiting.") Application.Exit() Catch ex As Exception MessageBox.Show("The following error occurred: " & vbCrLf & ex.Message) Application.Exit() End Try ' Connect to the database. cn.Open("\Windows\Start Menu\Programs\larryroof\nwind.cdb") ' Load the Employees recordset. rsEmployees.Open("Employees", cn, InTheHand.AdoceNet.LockType.Optimistic, _ CommandType.TableDirect) ' Display the record. ShowRecord() ' Load the list of tables in the database. rsTables.Open("SELECT * FROM MSysTables WHERE TableFlags = 0", cn) ' Set a flag used to control the loading process. Loading = True ' Load the combobox on the grid view with the list of tables. While Not rsTables.EOF comboboxTables.Items.Add(rsTables.Fields("TableName").ToString) rsTables.MoveNext() End While ' Clear the loading flag. Loading = False ' Select the first table in the combobox, which will trigger filling the grid. comboboxTables.SelectedIndex = 0 End Sub
在这个事件过程的开头处,可以看到与 Northwind 数据库的连接是在何处建立的。接下来,我使用 ADOCE NET Wrapper Recordset 对象来检索 Employees 表。
调用 ShowRecord 例程可更新逐条记录的显示。在本文的后面,我们将检验这个例程。
在随组成 Northwind 数据库的表列表一同显示的网格上加载 ComboBox 的代码位于 Form Load 事件过程的底部。这个表列表是通过查询 Pocket Access 数据库中的 MSysTables 表生成的。这个表可以在每个 Pocket Access 数据库中找到,它保存了数据库中所有表的列表。TableFlags 字段定义了每个表的类型。TableFlags 值为“O”的那些表是用户表,例如 Customers、Employees、Orders 和 Order Details。
该事件过程在完成时将 ComboBox 的 SelectedIndex 属性设置为 0,从而有效地选择了数据库中的第一个表,这将反过来促使加载 DataGrid。
本演示应用程序中有两个例程,它们负责显示从 Pocket Access 数据库检索的数据 — ShowRecord 例程和 SelectedIndexChanged 事件过程。
每当 Employees 记录集中活动记录的位置更改时,就会调用 ShowRecord 例程。
Sub ShowRecord() ' Display the record. textboxFirst.Text = rsEmployees.Fields("FirstName").ToString textboxLast.Text = rsEmployees.Fields("LastName").ToString End Sub
引用 Recordset 对象的 Fields 集合,以将各个字段加载到显示中。
注为了更新数据库,只需简单地反向进行这种安排,以便将 TextBox 控件的内容重新加载到字段中。
填充 DataGrid 控件是在 ComboBox 控件的 SelectedIndexChanged 事件中处理的。在这种安排下,每当用户从 ComboBox 中选择一个新表时,都会重新加载 DataGrid。
Private Sub comboboxTables_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles comboboxTables.SelectedIndexChanged ' Check to see if the loading process is running. If it is, then exit. If (Loading) Then Exit Sub End If ' Close the recordset if already in use. If rsGrid.State = 1 Then rsGrid.Close() End If ' Open the recordset. rsGrid.Open(comboboxTables.Text, cn, InTheHand.AdoceNet.LockType.ReadOnly, _ CommandType.TableDirect) ' Load the grid. gridRecords.DataSource = Nothing gridRecords.DataSource = rsGrid End Sub
与前面的示例(将字段手动加载到各个 TextBox 控件中)不同,此处我们要改用数据绑定。我们首先根据 ComboBox 中选定的表来检索记录集。接下来需要做的就是将 DataGrid 控件的 DataSource 属性设置为我们的记录集。
注ADOCE NET Wrapper 的 InTheHand 实现的其中一个功能就是支持数据绑定。
演示应用程序中需要进行检查的最后一部分是用于导航记录集的代码。Pocket Access Demo 应用程序的逐记录组件包含四个导航按钮,它们允许用户:
• |
移动到第一个记录 |
• |
移动到上一个记录 |
• |
移动到下一个记录 |
• |
移动到最后一个记录 |
这些函数的每一个都是在如下所示的四个按钮的 Click 事件过程中实现的。在每个示例中,在记录集中重新定位指针后,我们调用 ShowRecord 进程来更新显示。
Private Sub buttonFirst_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles buttonFirst.Click ' Move to the first record. rsEmployees.MoveFirst() ShowRecord() End Sub Private Sub buttonLast_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles buttonLast.Click ' Move to the last record. rsEmployees.MoveLast() ShowRecord() End Sub Private Sub buttonPrevious_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles buttonPrevious.Click ' Move to the previous record. rsEmployees.MovePrevious() If (rsEmployees.BOF) Then rsEmployees.MoveFirst() End If ShowRecord() End Sub Private Sub buttonNext_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles buttonNext.Click ' Move to the next record. rsEmployees.MoveNext() If (rsEmployees.EOF) Then rsEmployees.MoveLast() End If ShowRecord() End Sub
这就是您所了解的内容 — 在采用 .NET Compact Framework 编写的移动应用程序中使用 Pocket Access 数据库的基本知识。如您所见,它非常简单,尤其是当您具有一些 ADO 背景知识时。
Pocket Access 为您提供了存储数据的另一种选择。它尤其适合具有中小型数据需求的应用程序,以及那些需要将数据传回基于 PC 的 Microsoft Access 数据库的应用程序。
想要在一个星期内速成 .NET Compact Framework 吗?我的培训可以实现您的愿望。我提供了一个为期五天的 NETCF 培训班,它将为您提供速成需要的所有内容。我会向您介绍如何使用 .NET Compact Framework、SQL Server CE 和 XML 来创建健壮的移动解决方案。有关详细的概述,请访问 www.larryroof.com。
如果您无法参加面对面的培训班,请通过 Apress 购买我的新书 The Definitive Guide to the .NET Compact Framework。它全面概述了如何通过 .NET Compact Framework 创建移动应用程序。这本书花费了我很长的时间,在此我要感谢 Dan Fergus 在我受伤后帮我完成了这本书。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者