1、开发使用 ADOCE 的 Windows CE 数据访问应用程序Microsoft Corporation1999 年 6 月摘要:介绍 Microsoft(R) ActiveX(R) Data Objects (ADO) 和 ActiveX Data Objects for Microsoft Windows(R) CE (ADOCE),并介绍如何使用 ADOCE。同时讨论 Recordset 和 Field 对象,其中包括:介绍介绍 ADO 和 ADOCE Recordset 和 Field 对象使用 ADOCE摘要详细信息介绍通过 Microsoft ActiveX Data Objec
2、ts (ADO),客户机应用程序能够通过 OLE 数据库提供程序访问并处理数据库服务器中的数据。ActiveX Data Objects for Microsoft Windows CE (ADOCE) 提供了 ADO for Windows CE 的一个子集。 ADOCE 能够启动对存储于本地设备中的数据库的访问功能,并为网络数据库中的数据提供同步功能,从而在 Windows CE 操作系统中增加了新的数据库功能。ADOCE 能够与 Handheld PC (H/PC) 和 Palm-size PC 1.2 版一同使用。这篇文章介绍了 ADO 和 ADOCE,对 Recordset 和 Fi
3、eld 对象进行了说明,并讨论了 ADOCE 的应用方式。介绍 ADO 和 ADOCEADO 是 Microsoft 为所有数据类型提供的战略性高级接口。采用 ADO 的应用程序可以通过 OLE 数据库提供程序访问并处理数据库服务器中的数据。ADO 的主要优点是:使用简单、速度高、内存占用少、磁盘占地面积少。ADO 提供了一致的、高性能的数据访问方式,可以使用应用程序、工具、语言甚至是 Internet 浏览器创建前端数据库客户机程序或中层业务对象。ADO 是 Microsoft Universal Data Access 策略的中心组件。Universal Data Access 为包括关系
4、型和非关系型数据库在内的各种信息资源提供了高性能的访问方式,以及一个独立于工具和语言的、易于使用的编程接口。得益于这些技术,公司能够集成不同的数据资源、创建易于维护的解决方案并自由选择最好的工具、应用程序和平台服务。ADOCE 提供了 ADO for Windows CE 操作系统的一个子集,其中包括 Recordset 和 Field 对象的实施过程。ADOCE 能够启动对存储于本地设备中的数据库的访问功能,并为网络数据库中的数据提供同步功能,从而在 Windows CE 操作系统中增加了新的数据库功能。ADOCE 可以由 Microsoft Windows CE Toolkit for M
5、icrosoft Visual Basic(R) 6.0 版等任一实现了 COM 的环境中访问 Windows CE 数据库引擎。ADOCE 提供了下述功能: 自动实现对台式主机的双向同步。 新的数据类型:双精度型和布尔型(与 Windows CE 数据库相比较) 。 对 SQL 的支持。ADOCE 中的高级 SQL 支持功能是“美国国家标准委员会 (ANSI)”的 SQL 的一个子集。它所新增的数据库引擎功能可以提供字段名、多个排序关键字、较为复杂的筛选功能、表和索引的创建功能、删除和编辑功能以及多个表的联接功能。 熟悉的 recordset.fieldname 访问方式。 桌面 ADO 功
6、能。 Recordset 和 Field 对象ADOCE 控件有两个对象:Recordset(记录集)和 Field(字段)。记录集是一个虚拟的数据库表,它的字段和行与实际数据库表字段和行的子集相对应,而这些实际数据库表位于基于 Windows CE 的设备中。如果您对记录集行中的信息进行添加、删除或更改操作,您可以将这些改动的情况传递给表中相应的部分。当您改动记录集中的数据时,记录集将改动情况存储在内存中,您还可以在更新基础数据前取消这些操作。ADOCE 不支持分批更新。每次已完成数据更改,但又没有提交到基础数据库的行只能有一个。下面的表格显示了 Recordset 对象能够支持的方法。方法
7、 说明AddNew 在记录集中添加一行。CancelUpdate 取消内存中保留的更改。Clone 复制记录集。Close 关闭记录集。Delete 删除记录集中的行。GetRows 返回记录集中存储的数据。Move 更改指向记录集当前行的指针。MoveFirst 使第一行成为当前行。MoveLast 使最后一行成为当前行。MoveNext 将当前行指针指到下一行。MovePrevious 将当前行指针指到上一行。Open 定义并打开记录集;运行 SQL 命令。Supports 定义记录集是否支持某一特征。Update 提交内存中的更改,并更新实际表。下一表格显示 Recordset 对象所支
8、持的属性。属性 说明AbsolutePage 指定新的当前记录所要移动的页。AbsolutePosition 指定 Recordset 对象当前记录的序号位置。ActiveConnection 设置当前的数据库连接。通常是一个长度为零的字符串 (“)。对于运行 Pro Edition 软件的 H/PC,则指的是 cdb 文件的名称。BOF 指明当前记录的位置是否位于 Recordset 对象第一个记录的前面。Bookmark 指定唯一标识 Recordset 对象的记录的书签。CacheSize 指定在本地内存中进行缓存的 Recordset 对象的记录数量。CursorType 指明 Rec
9、ordset 对象中所使用的光标的类型。EditMode 指明当前记录的编辑状态。EOF 指明当前记录的位置是位于 Recordset 对象最后一个记录的后面。LockType 指明编辑过程中置于记录中的锁定类型。PageCount 指明 Recordset 对象中包含有多少页数据。PageSize 指明构成记录集的一页的记录有多少条。RecordCount 返回一个较长的数值,显示 Recordset 对象中记录的当前数量。Source 指明 Recordset 对象中数据的源,即 SQL 语句或表名。不能直接创建 Field 对象,因为它们只存在于现有记录集的上下文中。用 Set 函数指向
10、特定的 Field 对象。Field 对象没有方法或事件。除了 Value 属性外,所有的属性都是只读的。下面的表格显示了 Field 对象能够支持的属性。属性 说明ActualSize 指明一个字段数值的实际长度,以字节为单位。Attributes 返回指明 Field 对象的一个或多个特性的数值。DefinedSize 用于确定 Field 对象的数据容量。他将以字符为单位,返回字段定义的大小,而 ActualSize 将以字节为单位,返回定义的大小。Name 返回字段的名称。Type 指明 Field 对象的数据类型。UnderlyingValue 指明数据库中 Field 对象的当前数
11、值。Value(默认) 指明记录集中 Field 对象的当前数值。Fields 集合针对记录集中的每一列提供一个 Field 对象。可以通过名称或索引参考特定字段。Fields 集合支持 Count 属性,该属性指明记录集中字段的编号。使用 ADOCE通过 ADOCE,数据库即可自由出入基于 Windows CE 的设备。您也可以在设备上或桌面计算机的模拟器上创建数据库或进行访问。以下各节说明了 ADOCE 的使用方式,并列举了一些示例。注意 ControlConsts.bas 安装于 Program FilesMicrosoft Visual StudioVB98VBCESamples。这一
12、文件包含 ADOCE 和其他控件的枚举方式的定义。所需软件要使用 ADOCE 控件,需要安装下述软件: Microsoft Windows CE Services 2.1 版或更新版本 Microsoft Windows NT(R) Workstation 4.0 版或 Windows 95 或 98 为正在使用的设备提供的 Microsoft Windows CE Platform SDK Microsoft Visual Basic, Professional Edition 6.0 版,开发系统或 Microsoft Visual Basic, Enterprise Edition 6.
13、0 版 Microsoft Windows CE Toolkit for Visual Basic 6.0 版 注意 Windows CE Toolkit for Visual Basic 中包含 ADOCE 控件。在桌面计算机和设备之间移动数据库您可以在桌面计算机和基于 Windows CE 设备之间移动数据库表。存储在桌面计算机中的数据库是 Microsoft Access(R) 数据库格式。存储在设备中的数据库是标准的基于 Windows CE 表的格式,其中带有已添加到 ADOCE 系统表的附加信息。如果要将桌面计算机的数据库复制到设备 1. 将设备与桌面计算机相连接,并打开“移动设备
14、”窗口。2. 选择“移动设备”窗口“工具”菜单的“导入数据库表”命令。将出现“打开”对话框。3. 选择包含要导入的表的 Access .mdb 文件。将出现“从数据库导入到移动设备”对话框,其中带有数据库中表和字段的列表。4. 选中要导入的表和字段的复选框,清除不希望导入的表和字段的复选框。5. 对于要添加只读属性的表,请选中“只读”复选框。6. 如果希望覆盖设备中与 .mdb 文件中的表同名的表,请选择“覆盖已有的表和 (或) 数据”复选框。7. 选择“确定”开始进行转换。 如果要将设备的数据库复制到桌面计算机 1. 将设备与桌面计算机相连接,并打开“移动设备”窗口。2. 选择“移动设备”窗
15、口“工具”菜单的“导出数据库表”命令。将出现“从移动设备导出到数据库”对话框,显示相连接设备的 ADOCE 表。3. 选择“浏览”按钮,以便选取 Access .mdb 文件。您也可以在“位置”框中键入路径和文件名。如果文件不存在,ADOCE 会为您创建。4. 选中要导出的表的复选框,清除不希望导出的表的复选框。ADOCE 会将选中的所有表置于同一 .mdb 文件中。5. 如果希望覆盖 .mdb 中与所选 ADOCE 表同名的表,请选择“覆盖已有的表和(或)数据”复选框。6. 选择“确定”开始进行转换。 如果要在由 .mdb 文件转换成 ADOCE 表以及由 ADOCE 表转换到 .mdb 文
16、件的过程中使用可编程控件,您可以分别使用 DesktopToDevice 和 DeviceToDesktop 函数。这些函数的行为方式与“从数据库导入到移动设备”和“从移动设备导出到数据库”类似,只是不会出现用户选项对话框。所有的进度栏都会出现,以便显示传输状态。返回的错误不会导致自动显示日志文件。而是由函数返回错误值 HRESULT,并且由发出调用命令的应用程序采取适宜的措施。通过 DesktopToDevice 函数,您就可以指定要转换的字段。不过,通过 DeviceToDesktop 函数,默认情况下将转换表中的所有字段。以下代码示例显示一个简单的 Visual Basic 应用程序,它
17、将 Visual Basic 中的 Northwind 数据库的一个子集复制到设备,没有进行同步,但覆盖了所有现存的 Northwind 表。Employees 表将作为只读表发送,而 Products 表能够进行更新。Declare Function DesktopToDevice Lib“c:program fileswindows ce servicesadofiltr.dll“ _(ByVal desktoplocn As String, _ByVal tablelist As String, _ByVal sync As Boolean, _ByVal overwrite As In
18、teger, _ByVal devicelocn As String) As Longresult = DesktopToDevice (“c:mydbsnwind.mdb“, _“!EmployeesProducts.ID.Name.Quantity“, False, True, “)If result 0 ThenDo While Not rs.EOFList1.Additem rs.Fields(“firstfield“).Valuers.MoveNextLoopEnd Ifrs.Closeset rs = Nothing以下代码示例显示如何在数据库中创建索引,以便进行快速排序。它需要一
19、个名为 List1 的列表框。Dim rsSet rs = CreateObject(“ADOCE.RecordSet“)rs.open “create index i1 on mytable (firstfield desc)“rs.open “select * from mytable order by firstfield desc“,“, adOpenKeyset, adLockOptimistic If rs.RecordCount 0 ThenDo While Not rs.EOFList1.Additem rs.Fields(“firstfield“).Valuers.MoveN
20、extLoopEnd Ifrs.Closeset rs = Nothing存储并检索信息如果要在数据库中添加、删除或更改信息,打开记录集时必须更改默认的 CursorType 和 LockType。以下代码示例显示如何在数据库中存储信息:Dim rsSet rs = CreateObject(“ADOCE.RecordSet“)rs.open “mytable“, “, adOpenKeyset, adLockOptimisticrs. Addnewrs.fields(“firstfield“) = “ActiveX Data Objects“rs.fields(“secondfield“)
21、= 1.8rs.Updaters.CloseSet rs = Nothing如果您使用带参数的 AddNew 方法,则因为改动情况将自动反映到数据库,所以不需要使用 Update 方法。以下代码示例说明如何使用 AddNew:rs.Addnew “firstfield“, “Windows CE“如果要更改记录,而不是添加记录,则应在对字段进行必要的改动后使用 Update 方法。如果您使用带参数的 Update,则改动情况将自动反映到数据库。以下代码示例说明如何使用 Update:rs.Update “firstfield“, “ADOCE“在您使用 AddNew 和 Update 在数据库
22、中存储数据后,可以用 Value 属性获取存储于字段中的信息。以下代码示例说明如何由 ADOCE 数据库检索信息。它需要一个名为 List1 的列表框。Dim rsSet rs = CreateObject(“ADOCE.RecordSet“)rs.open “mytable“, “, adOpenKeyset, adLockOptimistic If rs.RecordCount 0 ThenDo While Not rs.EOFList1.Additem rs.Fields(“firstfield“).Valuers.MoveNextLoopEnd Ifrs.Closeset rs = N
23、othing分发 ADOCE 应用程序必须在桌面计算机和设备中都安装 ADOCE 应用程序的组件。分发 ADOCE 应用程序的一个途径是更改 Microsoft Windows CE Toolkit for Visual Basic 6.0 中自带的示例安装程序。所有 ADOCE 安装应用程序都应该确认是否安装了 Windows CE Services 2.1 或更新版本,并且在 ADOCE .cab 文件中添加了对应用程序的 AppMgr .ini 文件的引用。使用运行了 Pro Edition(专业版)软件的 H/PC本节说明了能够在运行 Microsoft Windows CE、Hand
24、held PC Professional Edition 3.0 版的 H/PC 中执行的其它过程。创建数据库以下代码示例说明如何在运行 Pro Edition 软件的 H/PC 中创建外部数据库:Dim rsSet rs = CreateObject(“adoce.recordset“)rs.Open “create database mydatabase.cdb“Set rs = Nothing由 .cdb 文件检索信息如果您在运行 Pro Edition 软件的 H/PC 中创建了数据库,您可以在连接参数中将路径传递给数据库,以便访问数据。所有能通过空连接字符串 (“) 执行的操作,都可
25、以通过更改连接字符串在 .cdb 文件中执行。以下代码示例说明如何由 .cdb 文件检索信息。Dim rsSet rs = CreateObject(“ADOCE.RecordSet“)rs.open “mytable“, “mydatabase.cdb“, adOpenKeyset, adLockOptimistic If rs.RecordCount 0 ThenDo While Not rs.EOFList1.AddItem rs.Fields(“firstfield“).Valuers.MoveNextLoopEnd Ifrs.Closeset rs = Nothing摘要ADOCE 是一种能与 Windows CE Toolkits for Visual Basic 一同使用的应用程序级数据访问对象模型。ADOCE 能够启动对存储于本地设备中的数据库的访问功能,并为网络数据库中的数据提供复制和同步功能,从而在 Windows CE 中增加了新的数据库功能。ADOCE 使用简单、速度高、内存占用少、磁盘占地面积少,很适合与结构紧凑、功能强大、运行快速的 Windows CE 操作系统一同使用。