近年来,移动设备的爆炸性增长促使消费者和企业对新型移动应用程序的需求不断提高。在这种背景下,Microsoft 创建了许多工具和框架,以便使软件开发人员可以充分利用这些智能设备的功能。将这些工具集和广泛的设备选项组合起来可以创建最先进的移动应用程序。
Microsoft® SQL 2000 Windows® CE Edition(又称作 SQL Server™ CE 2.0)甚至将 Microsoft SQL Server 的更多功能扩展到了基于 Windows CE 的设备上。SQL Server CE 2.0 为在 Windows CE 或 Windows CE .NET 操作系统上构建可靠的数据库应用程序提供了所有关键功能(例如,数据存储、优化查询处理器、多个连接选项等等)。这个新版本还提供了与 SQL Server 2000 的横向兼容性。令人难以置信的是,它提供了该功能的全部内容,但是却能够保持极小的内存足迹。
该版本提供了重要的新功能以及对其前身的性能改进。如果您以前用过 SQL Server CE,将会注意到新版本对性能作了改进,并且将编程模型扩展为支持 .NET Compact Framework。
在本文中,我们将关注新版 SQL Server CE 的一些关键的新功能,并考察突出这些功能的代码。请记住,本文并不打算介绍 SQL Server CE 产品的所有方面。无论您是经验丰富的移动开发人员,还是刚入门的新手,它都将激起您使用新版 SQL Server CE 创建移动应用程序的欲望。
开发移动解决方案
如果您是创建移动应用程序的新手,您会发现包含基于 Windows 的移动设备、开发工具和框架的列表是令人畏惧的。SQL Server CE 2.0 只是移动开发人员“弹药库”中的一个“武器”。要推荐一种完美的工具和设备组合来创建特定的移动解决方案是不可能的。不管怎样,有一些变数需要考虑。
当今的开发人员可以面向一系列基于 Windows CE 的设备。Pocket PC (PPC) 和 Handheld PC (HPC) 的面世已经有一段时间了。其中许多设备都装备了无线 LAN 模块(例如,蓝牙和 802.11b),从而使它们成为功能极为强大的设备,可以随时进行网络连接。基于 3.x 操作系统的设备倾向于面向消费者,但是很多公司意识到,这些设备既能用于其消费者又能用于其员工。
最近,制造商开始在设备自身中嵌入无线访问模块。过去,为了容纳无线 LAN 卡,需要在设备上配备体积巨大的 PC卡。蜂窝电话也趋于向 Pocket PC 集成,这将是一个有趣的技术组合。
配备有 Windows CE 的嵌入式设备已经渗入到我们的工作场所当中了。而且,为了扩展其接受程度,许多设备从物理上进行了强化,这样从几英尺高处掉下不至于损坏。
一个有趣的现象是,其中的许多嵌入式 OEM 设备的 Windows CE 操作系统版本甚至比面向消费者的设备上的那些可用 Windows CE 操作系统版本更新。最新的 OEM 设备运行 4.x 版的 Windows CE。在默认情况下,这些设备包括 .NET Compact Framework。这使得该平台对于想利用 Microsoft 提供的下一代工具和框架的企业开发人员来说,非常有吸引力。
Windows CE 也加进了各种各样有趣的硬件技术,包括 Compact Flash (CF) 读取器、条形码扫描器、磁条读取器、全球定位系统 (GPS)、指纹识别和照相机等。图 1 阐释了当今一些公司正在利用基于 Windows CE 的设备和工具开发的一些典型的移动解决方案。显而易见,这些移动应用程序需要一个紧凑且可靠的本地存储解决方案。
移动应用程序开发人员的最大挑战是,移动设备上的可用内存量相对较小(一般为 16MB-32MB)。移动设备的内存容量增加的越多,移动应用程序也就越复杂。当然,本地存储机制必须具备一个小内存足迹。撇去内存注意事项不谈,应用程序很可能还要针对本地存储执行复杂的查询。
此外,这些应用程序在联机状态和脱机状态时都必须工作得一样好。这就有必要具备本地和远程数据访问 API,以及与后端数据库间的某种形式的同步。幸运的是,SQL Server CE 2.0 提供了一个用于生成满足这些要求的应用程序的框架。
处于脱机模式时,SQL Server CE 在本地设备上提供存储。数据库更改可以在设备上被可靠地跟踪,当重新建立连接时,这些更改就可以和后端数据库进行同步。服务器端更改也是如此。SQL Server CE 支持名为“合并复制”的功能,在将该功能与 SQL Server 2000 协同使用时,可以对所有数据库更改提供双向同步。
移动开发工具
移动应用程序开发人员既可以选择使用现有的工具进行开发,也可以用 SQL Server CE 2.0 的下一代工具进行开发。
对于喜欢使用 eMbedded Visual Tools 3.0 开发移动应用程序的人来说,这些旧式工具继续受 SQL Server CE 2.0 支持。可以继续用 eMbedded Visual Basic® 和 eMbedded Visual C++® 编写应用程序。如果您选择使用 eMbedded Visual Tools,请注意,SQL Server CE 2.0 要求在设备上安装 3.x 版或更高版本的 Windows CE 操作系统。
使用 Microsoft 的下一代工具和框架,快速开发移动应用程序将成为可能。随着应用程序开发转向 Windows .NET 平台,移动应用程序将可以利用当今桌面平台具有的许多创新。用 eMbedded Visual Basic 或 Visual C++ 编写的应用程序将可以升级到 Visual Basic .NET、C# 和 ADO.NET。
Microsoft 已经向世人展示了其智能设备扩展 (SDE),它可以让移动开发人员利用基于 Visual Studio®.NET. 的统一工具集。Visual Studio .NET 与 SDE 的结合会为创建基于 Windows CE 的应用程序提供一个无缝集成的开发平台。
Visual Studio .NET 的下一版本(代号为“Everett”)将为 .NET Compact Framework, Pocket PC 200x 和 Windows CE .NET 4x 设备提供本机支持。
SQL Server CE 2.0 语言功能
SQL Server CE 2.0 包括其自身的本机 OLE DB 提供程序。与 SQL Server 2000 OLE DB 提供程序(公开许多属性来指定服务器和数据库)不同的是,SQL Server CE 仅使用单个属性 — DBPROP_INIT_DATASOURCE,用该属性打开数据库文件时使用的是完整路径。例如,要打开数据库文件 \Windows\Northwind.sdf,在调用 IDBProperties::SetProperties 时,要在 DBPROP_INIT_DATASOURCE 属性中传递字符串 \Windows\Northwind.sdf。
SQL Server CE 还支持文件级的访问控制机制 — 其名称为数据库密码。每次打开数据库时必须传递这个密码。在提供程序特定的属性集 DBPROPSET_SSCE_DBINIT 中,属性 DBPROP_SSCE_DBPASSWORD 应当用于指定该值。在新建数据库时,该属性可用来指定必须使用的密码。
SQL Server 2000 中逐渐为人所了解和喜爱的内部函数现在也得到支持。现在您可以在查询中使用数学函数、字符串函数和系统函数来执行运算并返回标量值。而在以前,您需要使用 eMbedded Visual Basic(或 eMbedded Visual C++)函数来完成此操作。与 SQL Server CE 1.0 相比,使用内部函数可以大大提高性能。
例如,为了让 ListBox 中的结果更易于格式化,图 2 演示了如何将某一列转换为 char(50) 列。在 SQL Server CE 中,对 SELECT 语句使用 UNION 会将两个或更多个查询的结果组合到单个结果集中,该结果集由属于该联合中全部查询的所有行组成。下面的代码片段演示了如何在 SELECT 语句中使用这个新的 UNION 子句:
Dim strSQL As String = "SELECT * FROM TableA UNION SELECT * FROM TableB"
SQL Server CE 2.0 通过 ADO.NET 增加了对参数化查询的支持。该功能对于使用 eMbedded Visual Tools 4.x(使用 OLEDBCE 提供程序)的开发人员也是可用的。那些熟悉 SQL Server 2000 中参数化查询的人会注意到一些差别。由于 SQL Server CE 没有内置的查询存储机制,因此参数实际上是在运行时提供的值的占位符(“?”)。SQL Server 2000 和 SQL Server CE 间的另一个明显的区别是,前者不支持命名参数。正像下面的代码所示,对参数化查询的支持是 SQL Server CE 2.0 的新功能。
Dim strSQL As String = "INSERT INTO TableA (col1, col2) VALUES (?, ?)";
索引拉出是另一个新功能。应用程序调用 Pull 方法,以便从 SQL Server 数据库提取数据,并将其存储在 SQL Server CE 中的数据库表中。最初的 SQL Server CE 版本只支持表的主键。SQL Server CE 2.0 则支持主键和所有其他索引。
在应用程序中使用 Pull 方法,可通过设置适当的跟踪选项来跟踪对 SQL Server CE 表作出的更改。SQL Server CE 跟踪所有的插入、更新和删除操作(请参阅 图 3)。
与先前版本的 SQL Server CE 相比,新版本的另一个改进是加入了更加可靠的错误处理功能。正如您可能在前面代码片段中所注意到的那样,在 .NET Compact Framework 中用 Visual Basic .NET 和 C# 编写的应用程序可以使用内置的 try/catch 支持。如果您用 Visual Studio .NET 编写过任何桌面应用程序,可能就非常熟悉这种方式的异常处理。那些在 eMbedded Visual Basic 中被限制以 On Error GoTo 方式处理异常的开发人员肯定会欣赏这个新的语言功能。为了完善 try/catch 构造,SQL Server CE 增加了一个名为 SqlCeException 的新类,这个类允许您捕捉本机 SQL Server CE 错误并适当地处理它们。
与 SQL Server CE 1.0 不同的是,这个版本为开发人员提供长错误说明,而不仅仅是错误号。错误说明机制是作为一个可选的 DLL 来实现的,您可以将该 DLL 放在设备上的 SQL Server CE 应用程序路径中。当您调试应用程序时,可以和应用程序一起部署该 DLL。一旦您完成对应用程序的调试,便可以从设备中删除这个 DLL。
服务器功能
SQL Server CE 2.0 包括一个新的连接设置向导,通过它就可以简化虚拟目录和数据访问权限的创建(请参见图 4)。用过 SQL Server CE 以前版本的人一定知道,在基于 Windows CE 的设备和 SQL Server 之间进行通讯必须要有特定的虚拟目录和访问权限。使用这个连接向导,可以在运行 Microsoft Internet 信息服务 (IIS) 的计算机上创建和管理虚拟目录。此外,还可以在运行 IIS 和 SQL Server 的计算机上配置和管理 NTFS 权限。
与以前的版本类似,这个版本使用在 IIS 下运行的 ISAPI DLL,以便于运行 Windows CE 的设备和 SQL Server 2000 进行通讯。这意味着,如果您的设备可以用 HTTP 访问 SQL Server CE 虚拟目录(也就是说您可以通过 Pocket Internet Explorer 浏览它),那么您便可以通过远程数据存储 (RDA) 或合并复制功能连接到后端数据库。
正如对于先前版本的 SQL Server CE 一样,现在可以使用密码或者将密码与 128 位加密算法结合使用,来保护本地数据库的安全。在本地数据库中使用密码将防止通过编程方式访问本地数据库,但无法防止从数据库文件中以明文形式读取任何数据。
结合使用密码和加密将防止编程访问,并将以加密形式存储用户数据。如果您使用的是 Pocket PC 2002 扩展,那么在默认情况下,会安装带有 128 位加密的 SSL 本机 RSA 增强的 DLL。如果您使用的不是 Pocket PC 2002,将需要下载高度加密包 (http://www.microsoft.com/mobile/pocketpc/downloads)。
目前,Microsoft 建议您在 IIS 框中启用 SSL,并使用基本身份验证。Microsoft 计划在以后的 Windows CE .NET 版本(4.x 和更高版本)中添加 Kerberos 支持。这将允许在 Windows 2000 或 .NET Server 与 CE.NET 设备之间委托凭据。一旦 Windows CE .NET 4.x 设备开始交付,SQL Server CE 2.0 将提供支持文档来解释如何利用 Kerberos 支持。
与 SQL Server 2000 相比,SQL Server CE 2.0 的另一个改进是在支持索引的数量上。以前版本最多也就 32 个索引,而最新版本则支持 249 个索引。
SQL Server 客户端数据提供程序是另一个包括在 SQL Server CE 2.0 中的组件。它是作为托管包装实现的,允许应用程序直接与后端 SQL Server 数据库进行交互。它应该只用于连接有效的情形,在这种情况下,移动设备必须具备持续的网络连接,并且不需要本地数据存储。
SQL Server 客户端数据提供程序提供的另一个选项是,通过提供程序来查询 SQL Server 以检索要存放在本地 SQL Server CE 数据库中的数据的功能。
SQL Server CE 2.0 还包括一个对 ISQLW 的显著改进(请参见图 5)。这是 SQL Server 企业管理器的 SQL Server CE 副本。您可以通过使用 ActiveSync® 进行文件复制来将可执行文件手动安装到设备上。当您第一次部署 Visual Studio .NET SDE 或 eMbedded Visual Tools 应用程序时,ISQLW 将自动安装到应用程序的“开始”菜单上。
图 5 ISQLW
在先前版本的 ISQLW 中,没有一种查看数据库架构的简便方法。除非您完整地记着该架构,否则编写查询会很困难。现在可以在树形视图中查看所有的数据库对象,就好像在 SQL 查询分析器的桌面版本中一样。
SQL Server CE 2.0 提供了两种基本方法来连接后端 SQL Server 数据库:RDA 和合并复制。RDA 访问功能支持与 SQL Server 7.0(和更高版本)数据库的连接。另一方面,合并复制要求后端必须是 SQL Server 2000。有关这两个连接选项的体系结构关系图,请参见图 6。
图 6 连接选项
SQL Server CE 2.0 中的 RDA 为基于 Windows CE 的应用程序提供了一种简单方法,用来从远程 SQL Server 数据库表中提取数据,并将数据存储在本地设备的数据库表中。然后,应用程序可以读取和更新本地数据库表。SQL Server CE 可以跟踪对本地数据库表作出的所有更改。利用这些信息,应用程序可以在以后将更改的记录从本地表推入到远程 SQL Server 数据库表中。
基于 Windows CE 的应用程序还能使用 RDA 提交要在远程 SQL Server 数据库上执行的 SQL 语句。例如,应用程序可以将用来插入、更新、删除记录的语句提交到远程 SQL Server 表。
有了 SQL Server CE,RDA 就可以基于 Internet。简单地说,SQL Server CE 通过 IIS 与后端 SQL Server 数据库进行通讯。通过借助于 IIS 建立连接,RDA 利用 IIS 的身份认证和授权服务。由于通讯协议是 HTTP,因此运行 SQL Server 的计算机可以放在防火墙后面,并能通过 Microsoft ISA Server(或 Microsoft Proxy Server)提供的发布规则来访问。
为了减少数据传输量,RDA 使用压缩机制。这使得 RDA 更适合无线传输。可以使用加密机制来保护用户的敏感数据。RDA 还具有一种处理通讯失败的机制。如果发生失败,则重新传输机制将从最后一个成功传输的消息缓冲区重新开始。
RDA 控件提供了对 SQL Server 2000 或 SQL Server 7.0 数据库的编程访问。RDA 访问是由 Visual Studio .NET 或 eMbedded Visual Tools 应用程序提供的。
SQL Server CE 合并复制是基于 SQL Server 2000 的,它使用同一个发布服务器/订阅服务器模型。使用合并复制可以让数据独立于设备和服务器进行更新。当设备以后连接到服务器时,便会进行数据同步。在创建订阅之前,必须配置 SQL Server 2000 复制、创建 SQL Server 发布(包括设置一个共享快照文件夹以存储发布的数据),然后为匿名订阅启用发布功能。
SQL Server CE 复制对象具备增加和删除订阅的方法,以及针对某个订阅初始化、调用和终止合并复制的方法。尽管正确配置后其编程并不难,但 SQL Server 的复制机制比 RDA 的更完善也更复杂。
SQL Server CE 2.0 有一个令人兴奋的新特性,那就是增加了 SQL Server CE 托管提供程序(或包装),它为使用 .NET Compact Framework 的 Visual Basic .NET 和 C# 移动应用程序提供了一个互操作性层。如果您已经在桌面应用程序中使用了 ADO.NET,那么您会觉得在 .NET Compact Framework 中使用 SQL Server CE 托管提供程序会很爽。这种编程模型以很直觉的方式使您能够与 SQL Server CE 数据库进行交互。
该包装实际上利用本机 SQL Server CE DLL。其优点是,eMbedded Visual Basic(或 eMbedded Visual C++)应用程序和 Visual Studio .NET 应用程序可以在同一台设备上并行运行。但是,这并不意味着就可以对同一个 SQL Server CE 数据库进行并发访问。它只意味着用两种平台编写的应用可以在同一台设备上共存。SQL Server CE 仍然是一个单用户数据库引擎。
.NET Compact Framework 中增加了两个可支持托管代码的命名空间。它们是:System.Data.SqlClient 和 System.Data.SqlServerCe。同时,一个名为 System.Data.SqlServerCE.SqlCeException 的类为 Visual Basic .NET 和 C# 提供了 try/catch 支持。
为了描述应用程序中使用合并复制的新托管代码包装的强大功能,对 Synchronize 方法的一次调用会将整个数据库架构以及底层数据下载到设备上,而无需编写一行数据描述语言 (DDL)。
编写应用程序
现在让我们用一个代码项目来说明 SQL Server CE 2.0 的新功能。我们将用 Visual Studio .NET 和 .NET Compact Framework 创建一个简单的 C# SmartDevice 应用程序。我们将该应用程序部署到 Pocket PC 2002 模拟器上,以便简化开发和测试。
在本例中,我们将使用在安装 .NET Compact Framework SDK 附带的 NorthwindCE 示例应用程序时创建的数据库。如果您很熟悉 SQL Server,那么有可能已对 SQL Server 2000 提供的 Northwind 数据库非常熟悉。NorthwindCE 示例应用程序包括一个名为 SetupRepl.bat 的安装脚本,该脚本将创建一个名为 Nwind_SQLCE 的数据库副本。该脚本还在运行 SQL Server 2000 的计算机上安装一个带有本地分发服务器的发布服务器。此外,它从 Nwind_SQLCE 数据库创建一个名为 SQLCEReplDemoNet 的合并发布。我们将指示示例应用程序订阅该发布。
图 7 新发布
一旦 SQL Server 实例被配置为一个复制的发布服务器/分发服务器,并具备一个定义了相应权限的快照文件夹,那么您就可以运行 NorthwindCE 示例附带的 SetupRepl.bat。如果一切正常,您应该看到发布已成功创建,如图 7 所示。
应用程序概述
我们设计的应用程序将阐释本文前面讨论的 SQL Server CE 2.0 的新功能,例如,如何使用 SqlCeReplication.Synchronize 方法来执行复制。我们将演示 SQL Server 2000 Nwind_SQLCE 数据库和本地 SQL Server CE 订阅数据库之间完整的(双向)同步,以及其他功能(例如,新的 SqlCeException 对象和使用参数化查询)。
图 8 Windows 窗体
图 8 显示了我们为 SmartDevice 应用程序设计的 Windows 窗体。该应用程序允许我们通过输入姓这一部分来查询本地订阅数据库的 Employees 表,并将在 ListView 控件中显示结果。我们还添加了一个 Synchronize 菜单项,它使我们能将 SQL Server 2000 数据库的任何更改强制复制到本地 SQL Server CE 订阅数据库。SmartDevice 可能不是一个令人兴奋的应用程序,但其中充满了趣味!
在开始前,我们假定您已经运行了 NorthwindCE 示例中的 SetupRepl.bat 脚本。确保 SQL Server CE 服务器代理已经用名为“sqlce”的 IIS 虚拟目录进行了配置,并且使用 HTTP 匿名访问(这对于生产应用程序来说无疑不是最佳做法)。您可以通过使用 SQL Server CE 2.0 所附带的 SQL Server CE 连接管理 MMC 管理单元来验证这些设置。
我们将要查看的代码的第一部分演示了如何使用 SQL Server CE SqlCeEngine 对象来创建一个空的数据库,以及如何使用 Replication 对象来完成将现有 SQL Server 发布与 Nwind_SQLCE 数据库进行同步。DBInit 函数是从 Form_Load 事件调用的。它首先创建一个空的订阅数据库(如果不存在的话),然后调用 DBSync 来将发布数据库与订阅数据库同步(请参见图 9)。
在 DBSync 方法中,为了方便示范和说明,我们对 Replication 对象的所有属性进行了硬编码。很显然,您将希望在应用程序定义的某种存储区(例如,SQL 表或 XML 文件)中维护这些属性。在本例中,我们使用的是 SQL Server 身份验证。Synchronize 方法创建订阅数据库,并获得该发布中所有数据库对象的整个架构(包括相关索引),如图 10 所示。
在订阅数据库创建之后,发布中的所有对象便在本地进行复制,我们可以在断开连接的情况下使用应用程序。不管是 SQL Server 2000 数据库的更改还是 SQL Server CE 数据库的更改,都可以在下次调用 DBSync 方法时使用合并复制功能来完成。
请注意,在 SDE 应用程序中捕获异常的 try...catch...finally 构造技术。通过 ShowErrors 方法可以显示 SQL Server CE 异常的详细信息。图 11 中的代码显示如何拆分 SQL Server CE 异常堆栈,并在客户端上的消息框中显示它。
最后我们要展示的代码示例是 FindEmployees方法,它从“Find Now”按钮的 Click 事件调用。该方法首先实例化一个 SqlCeConnection 对象,然后连接到本地订阅数据库。
接着,我们构造一个 SqlCeCommand 对象,该对象由针对 Employees 表的参数化查询组成,如图 12 所示。请注意我们是如何使用 RTRIM 内部函数来删除 FirstName 和 LastName 列的尾部空格的,这样可以在 ListView 控件中进行精细的格式化。
使用 SqlCeCommand 对象的 Parameters 集合,我们可以传入要与 SELECT 语句的 LIKE 运算符一起使用的搜索模式。最后,我们用 SqlCeDataReader 来执行查询并填充 ListView 控件,然后关闭并释放已经打开的、到订阅数据库的连接。
图 13 Pocket PC模拟器
图 13 显示了所完成的应用程序在 Pocket PC 2002 模拟器中运行时的外观。
部署时的考虑事项
最后,我们要回顾在将应用程序部署到现场时应考虑的几件事情。尽管 SQL Server CE 数据库引擎本身非常可靠,但是它运行的任何设备都有可能失败(这主要是由于电池寿命有限)。因此,您开发的任何移动解决方案始终都应该考虑到灾难恢复。
通过使用诸如 CF Media 之类的持续性内存技术可以实现持久存储。为了让用户能在需要冷启动的事件中恢复数据,应规划在 CF 中存储应用程序数据库和应用程序可执行文件。为您的应用程序创建一个 CAB 文件可以大大简化员工在现场安装应用程序的过程。