本月,Two for the Road 专栏将我带到了阳光明媚的加利福尼亚南部海滩,在这里,我试图在冲浪和 Pocket PC 开发之间保持平衡,做到劳逸结合。开始本打算在这两者之间保持完全的平衡,但是我很快惊异地发现 iPaq 在冲浪板上根本无法使用,因此我只能进行单调的冲浪运动了。谁曾想会是这样呢?您或许会想,Compaq 可能已在用户手册中对此问题提出了某种警告。
对于此问题,你们不必多虑,如果我能编写一个移动应用程序就好了,这样就可以打消那些开发同仁们的疑虑“Roof 这家伙将 iPaq 带到冲浪板上去到底想干什么?”。好吧,我承认,我需要帮助。一身古铜色的皮肤和一方滴着盐水的引人注目的镇纸石,这就是我此次旅行的唯一收获。
好了,有关我遇到的技术问题这一话题就到此为止吧。现在,让我们开始讨论移动数据的问题。与我上个月教您构建的移动字幕应用程序有所不同,那个程序的实用性和简单程度简直令人难以置信,您将要构建的大多数 Pocket PC 应用程序最终或多或少都要涉及到数据问题。
移动数据选项
开发移动应用程序的关键在于如何处理选项及其相关的权衡问题。这同样适用于将数据集成到移动应用程序这一主题。对于数据存储,您可以有以下选项:
顺序存取、随机存取和二进制文件:这些久经验证的方法,使得将数据合并到应用程序变得非常简单。其优点在于:根据您的需要,它们可以变得非常简单,也可以相当复杂。如果使用得当,它们能够提供最好的性能。不足之处在于:它们往往成为专用的解决方案,不易合并到企业环境。
Pocket Access 数据库:不要被 Pocket Access 这个名字所误导。这种移动数据方案与功能强大的桌面产品 Microsoft Access 差别很大。Pocket Access 缺乏窗体、报表、存储查询以及表之间的关系。简而言之,它只提供对一组表的存储和访问。另外,它还与 Microsoft Access 兼容,支持数据同步,提供一些简单的工具用于将表在设备间移动,而且可以使用 ADOCE(即 ActiveX® 数据对象的移动版本)对它进行操作(这一点以后再讨论)。
注意: Pocket Access 表的扩展名为 .cdf。
SQL Server 2000 Windows CE 版:目前功能最全面、性能最稳定的移动数据库非 SQL Server CE 莫属。它提供的关系数据库所占空间很小,但包含了一个查询处理器和一些合并复制功能。和 Pocket Access 一样,您可以使用 ADOCE 对 SQL Server CE 数据库进行操作。事实上,要将移动应用程序从用于 Pocket Access 转变为用于 SQL Server CE,通常需要对代码进行小小的改动。
注意: SQL Server CE 数据库的扩展名为 .sdf。
SQL Server CE 最适合于那些专门用来与基于企业的 SQL Server 数据库交互的应用程序。不过,尽管其性能卓越,它却不能和 Pocket Access 一样支持简单的 ActiveSync® 和 ADOCE API。
什么是 ADOCE?
使用 ADOCE,就可以从移动应用程序访问 Pocket Access 和 SQL Server CE 数据库。ADOCE 提供 ADO 功能的子集。它包含自己的内部数据库提供程序,通过该程序,您可以对存储在 Pocket PC 本地的数据库进行操作。使用 ADOCE,还可以通过 OLEDB 提供程序来访问数据源。
ADOCE 的主要优点在于:您可以使用自己的桌面 ADO 编码技术来开发移动应用程序。有关 ADOCE 支持哪些功能的详细信息,请查阅 eMbedded Visual Basic® (eVB) 中附带的帮助。
本月的应用程序:Mobile Sales
我在撰写本文时,意识到上个月的应用程序 Hello World 字幕具有明显的适销性,以后的应用程序要想达到这一境界恐怕很难。于是,我决定在本月的应用程序 Mobile Sales 中加点新鲜内容。尽管它可能不如 Hello World 字幕那样有吸引力,却说明了如何利用 ADOCE 将存储在 Pocket Access 数据库中的数据合并到移动解决方案。
Mobile Sales 展示了使用 Pocket PC 很容易就能使交货过程自动化。使用 Mobile Sales,交货人员能够快速填写每一地点订购的订单。这样,当他们进货时,只需要选择要添加到订单的每个项目的类型和数量。该数据存储在 Pocket PC 上的表中,可以从它下次连接的设备处检索该表。
Mobile Sales 由以下两个组件组成:
桌面交货应用程序
移动条目应用程序
我将带您一步步浏览这两个应用程序,以便在浏览之后,您对分发、使用和收集移动应用程序生成的数据这整个过程能有一个全面的了解。
Mobile Sales 数据库
用于 Mobile Sales 的 Microsoft Access 数据库包含四个表:
Customers:Customers 表专门用于填充设备应用程序中的组合框。该表在设备上是只读的。
Products:Products 表用于填充设备应用程序中的组合框,也是每个产品的定价信息源。该表在设备上是只读的。
Route:Route 表包含司机每天预定要访问的客户列表。根据这种情况,每天要用一组新客户来生成该表。该表在设备上是只读的。
Orders:Orders 表用于存储在字段中输入的订单信息。它在设计上非常简单,表中的每个记录代表客户订购的一个项目。
“Mobile Sales - 桌面”组件
“Mobile Sales - 桌面”组件负责将数据库传输到设备,然后从设备检索回单个 Orders 表。其界面非常简单,如下图所示。
图 1:“Mobile Sales - 桌面”界面
“Mobile Sales ? 桌面”使用 ADOCE API 来执行这些传输。ADOCE 提供了程序方法,用于将表传输到设备或从设备传输表。ADOCE API 简单得令人难以置信。它只包含两个函数:DESKTOPTODEVICE 和 DEVICETODESKTOP。
DESKTOPTODEVICE 用于将表从 Microsoft Access 桌面数据库复制到 Pocket Access 设备数据库。该函数的语法为:
DESKTOPTODEVICE(DesktopLocn, TableList, Sync, Overwrite, DeviceLocn)
其中:
DesktopLocn 是包含要传输的表的 Access 数据库的路径和文件名。您还可以将 DSN 用作该值。
TableList 是要复制的表和字段的列表。
该参数的格式为:
[!]表名.字段名。
前导 ! 用于指定表是只读的。
Sync 定义 ActiveSync 是否应维护桌面和设备数据库之间的同步。
Overwrite 指定是否应覆盖任何现有的表。
DeviceLocn 是指设备上的 Pocket Access 数据库的路径和文件名。
DEVICETODESKTOP:该函数用于将表从 Pocket Access 设备数据库复制到 Microsoft Access 桌面数据库。该函数的语法为:
DEVICETODESKTOP(DesktopLocn, TableList, Sync, Overwrite, DeviceLocn)
DEVICETODESKTOP 函数的参数与 DESKTOPTODEVICE 函数中所用参数完全相同。
下载 Mobile Sales 数据
使用 DESKTOPTODEVICE 函数之前,必须在“Mobile Sales ? 桌面”窗体模块的“一般声明”部分声明此函数,如下所示:
Private Declare Function DESKTOPTODEVICE Lib _
"c:\Program Files\Microsoft ActiveSync\adofiltr.dll" _
(ByVal desktoplocn As String, _
ByVal tablelist As String, _
ByVal sync As Boolean, _
ByVal overwrite As Integer, _
ByVal devicelocn As String) As Long
然后,使用以下代码将这四个表从桌面 Microsoft Access 数据库复制到设备 Pocket Access 数据库:
lResult = DESKTOPTODEVICE(App.Path & "\Mobile Sales.mdb", _
"!Customers..!Products..!Route..Orders..", False, True, _
"\tonked\Mobile Sales\Mobile Sales.cdb")
注意:
该代码位于示例的 mnuFunctionsDownload 单击事件中。
在此处,正在将 Customers、Products、Route 和 Orders 表复制到设备。其中 Customers、Products 和 Route 这三个表是只读的,其名称前标有“!” 。在这一过程中将覆盖任何现有的表。
上载订单数据
使用 DEVICETODESKTOP 函数之前,也必须在“Mobile Sales ? 桌面”窗体模块的“一般声明”部分声明此函数。
Private Declare Function DEVICETODESKTOP Lib _
"c:\program files\Microsoft ActiveSync\adofiltr.dll" _
(ByVal desktoplocn As String, _
ByVal tablelist As String, _
ByVal sync As Boolean, _
ByVal overwrite As Integer, _
ByVal devicelocn As String) As Long
然后使用以下代码将 Orders 表从设备 Pocket Access 数据库复制到桌面 Microsoft Access 数据库:
lResult = DEVICETODESKTOP(App.Path & "\Mobile Sales.mdb", _
"Orders..", False, True, "\tonked\Mobile Sales\Mobile Sales.cdb")
注意:
该代码位于示例的 mnuFunctionsUpload 单击事件中。
桌面组件概述
该组件展示了将数据移到设备或从设备移回数据实现起来很简单。利用 ADOCE API,您可以轻松地传输 Microsoft Access 表。
注意:
您可以使用示例附带的 Microsoft Access 数据库中的 Today's Orders 报表来生成订单报表,如下图所示:
图 2:订单报表
运行报表之前,您应该执行以下步骤:
使用“Mobile Sales ? 桌面”组件,将数据库下载到您的设备。
运行“Mobile Sales ? 设备”组件,处理一些客户订单。
使用