用 SQL Server CE 2.0 和.NET Compact Framework 开发紧凑而功能强大的移动应用程序

原文出处:MSDN Magazine Jan 2003(Go Mobile...)

本文假定你熟悉SQL Server 和 Visual Studio。

概要

  开发人员在为移动设备创建解决方案时可以有很多种选择。最大的挑战之一是找到一种既紧凑又健壮的本地存储方案。SQL Server CE 2.0 承诺在产品交付时两者兼备。其最新版本将比以往的版本在特色和性能上都有一个巨大的飞跃。本文将回顾开发人员目前在使用开发平台和开发工具上的一些选择。作者也将比较和总结 SQL Server CE 2.0 的新特色,并且将举一些例子来说明。


  近年来,移动设备的爆炸性增长,也促使消费者和企业对新型移动应用的需求。在这种背景下,微软建立了许多工具和框架,使软件开发 人员可以充分发掘这些智能设备的能力。将这些工具集和广泛的设备组合起来便可以创建最先进的移动应用。
  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 操作系统版本甚至比那些可获得的面向消费者的设备的操作系统版本更新 。最新的 OEM 设备采用版本为4.x 的 Windows CE。 这些设备缺省包括 .NET Compact Framework。这对想利用Microsoft 下一代工具和框架优点的企业开发人员来说非常有吸引力,
  Windows CE 也加进了各种各样有趣的硬件技术,包括 CF( Compact Flash)阅读器、条形码扫描器、磁条读取器、全球定位系统(GPS)、指纹 鉴定和照相技术等。Figure 1 说明了当今发展中企业利用基于 Windows CE 的工具和设备开发 的典型移动应用解决方案。显而易见,这些移动设备需要一个简洁而健壮的本地存储解决方案。
  移动应用开发人员最大的挑战是移动设备上可获得的内存较小(一般为 16MB-32MB)。移动设备的内存增加的越多,其应用程序也就越复杂。当然,本地存储机制必须 具备一个小规模内存空间。考虑内存问题的同时,应用程序很可能还要实现针对本地存储的复杂查询。
  此外,这些应用程序处于在线状态或不在线状态时都必须工作得一样好。这就必要具备本地和远程数据存取 APIs,以及与后台数据进行某种形式的同步。幸运的是,SQL Server CE 2.0 提供了 生成满足这些要求的应用程序的框架。
  处于离线模式时,SQL Server CE 提供设备自身本地的存储。数据库的变化可以在设备上被可靠地追踪,当重新建立连接时,它就可以和后台数据库进行同步。服务器端数据 的变化亦然。SQL Server CE 支持合并复制(Merge Replication)的特性。当与 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 需要在设备上安装 Windows CE 3.x 或更高版本的操作系统。
  使用 Microsoft 的下一代工具和框架,快速开发移动应用程序将成为可能。随着移动应用程序开发转向 Windows .NET 平台,移动应用程序将可以 利用当今桌面平台具有的许多创新。用 eMbedded Visual Basic 或 Visual C++ 开发的程序将升级到Visual Basic .NET、 C#、和 ADO.NET。
  Microsoft 已经向世人展示了他们的智能设备扩展(SDE:Smart Device Extensions),它可以让移动应用开发人员利用基于 Visual Studio® .NET 的统一 的工具集。Visual Studio® .NET 与 SDEs 结合为创建基于 Windows CE 的应用程序提供了一个无缝的集成的开发平台。
  Visual Studio .NET 的下一个版本(代号为“Everett”)将对 .NET Compact Framework、Pocket PC 200x 和 Windows CE .NET 4x 设备提供根本的支持。

SQL Server CE 2.0 语言特性

  SQL Server CE 包含自身特有的 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 也支持文件级的存取控制机制,叫数据库密码。每次打开数据库时必须传递这个密码。在特定的提供者的DBPROP_SSCE_DBPASSWORD 属性 中——属性集 DBPROPSET_SSCE_DBINIT 应该被用于设定这个值。当创建一个新数据库时,该属性可以被用来指定一个必须使用的密码。
  所有的内建功能以及 SQL Server 2000 中最受欢迎功能也将被支持。现在你可以在查询中使用数学的、字符串和系统函数来完成操作并返回标量值。以前你需要 用 eMbedded Visual Basic (或 eMbedded Visual C++)函数来实现。 与 SQL Server CE 1.0 相比,内建函数的使用赢得了巨大的性能。
  例如,为了让 ListBox 中的结果更容易格式化输出,Figure 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 (使用 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)是另一个新特性。程序调用 Pull 方法从 SQL Server 数据库中取得数据,并将它们存放在 SQL Server CE的数据库表中。 最初的 SQL Server CE 版本只支持表的主键。SQL Server CE 2.0 则支持主键和所有其它的附加索引。
  在程序中使用 Pull 方法能追踪 SQL Server CE 表的变化,通过设置适当的跟踪选项。SQL Server CE 跟踪所有的插入、更新和删除操作(见 Figure 3 )。
  与 SQL Server CE 以前版本相比,新版本的另一个改进是加入了更加健壮的异常处理。正如你可能在前面代码段中所注意到的那样,在 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 包括一个新的连接设置向导,通过它就可以简化虚拟目录的创建和数据存储许可(见 Figure 4 )。使用过 SQL Server CE 以前版本的 人一定知道基于 Windows CE 的设备和 SQL Server 之间的通信必须要有特定的虚拟目录和存取权限。使用这个连接向导,你可以在运行 IIS 服务的计算机上创建并管理虚拟目录。此外,你可以在运行 IIS 和 SQL Server的计算机上配置并管理 NTFS 许可。
  与以前的版本类似,这个版本使用运行在 IIS 下的 ISAPI DLL 协助 Windows CE 设备和 SQL Server 2000 之间的通讯。这意味 着如果你的设备可以用 HTTP 访问 SQL Server CE 虚拟目录( 也就是说你可以通过 Pocket Internet Explorer 浏览它),那么你便可以通过远程数据存储(RDA:Remote Data Access)或合并复制连接到后台数据库。
  在以前的 SQL Server CE 版本基础上,现在可以用密码或 128 位加密的密码来保护本地数据库的安全,在本地数据库中使用密码将防止通过编程存取本地数据库,但 无法防止读取数据库中的任何明文数据。 
  密码和加密一起使用就可以防止编程存取并且用户数据以加密形式存储。如果使用 Pocket PC 2002 扩展,那么在默认情况下会安装 128 位本地 SSL 增强 RSA DLL。如果你还没有使用 Pocket PC 2002,则必须下载高强度加密包:(http://www.microsoft.com/mobile/pocketpc/downloads)。
  Microsoft 通常建议在你的 IIS 中启用 SSL 并使用基本身份验证(Basic Authentication)。Microsoft 计划在以后的Windows CE .NET 版本中 (4.x 或更高) 增加 Kerberos 支持。这将允许 Windows 2000 或 .NET 服务器与 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 客户端数据提供者(The SQL Server Client Data Provider)是另一个包含在 SQL Server CE 2.0 中的组件。它是作为受管包装器实现的,允许应用程序直接与后台 SQL Server 数据库进行交互。 它应该只用于良好连接的情形,在这种情况下,移动设备必须具备持续的网络连接,并且不需要本地数据存取。
  使用 SQL Server 客户端数据提供者的另一个选择是能够通过它(The SQL Server Client Data Provider)查询 SQL Server 读取存放在本地 SQL Server CE 数据库中数据。
  SQL Server CE 2.0 还包括一个对 ISQLW 的显著改进(见 Figure 5)。可以说这是 SQL Server CE 中的 SQL Server 企业管理器(SQL Server Enterprise Manager)。你可以通过使用 ActiveSync® 进行文件拷贝 ,在设备上手动安装可执行程序。当你第一次部署 Visual Studio .NET SDE 或 eMbedded Visual Tools 程序时,ISQLW 将 被自动安装在设备的开始菜单上。


Figure 5 ISQLW

  以前的 ISQLW 没有一种容易的方法来查看数据库大纲(schema)。它使得编写查询代码很困难,除非完整地记忆大纲。现在可以在树形视图中查看 所有数据库对象,非常象桌面版本的 SQL 查询分析器(SQL Query Analyzer)。
  SQL Server CE 2.0 提供了两种基本方法来连接后台 SQL Server 数据库:RDA 和合并复制。RDA 支持与 SQL Server 7.0 (和以后的版本) 数据库的连接。另一方面,合并复制要求后台必须是 SQL Server 2000。Figure 6 是这两种方法的构架图表。


Figure 6 连接选项

  RDA 在 SQL Server CE 2.0 中为 Windows CE 程序提供了一种简单的方法从远程 SQL Server 数据库表中 拉(pull)数据,并将数据存储在本地设备的数据库表中。此时你的程序可以读取和更新本地数据库的表。SQL Server CE 可以跟踪本地数据库表的所有变化。利用这些信息,应用程序可以 在以后将变化后的记录从本地表推(push)到远程 SQL Server 数据库表中。
  基于 Windows CE 的应用程序还能通过 RDA 提交 SQL 语句,并在远程 SQL Server 数据库上执行。例如,程序可以提交诸如插入、更新、删除记录 等语句给远程 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 复制(Replication)对象具备增加、删除、订阅的方法,初始化和调用的方法以及终止某个订阅的合并复制(Merge Replication)的方法。尽管正确配置后其规划并不难,但 SQL Serve 的复制机制比 RDA 的更完善也更复杂。
  SQL Server CE 2.0 的一个令人兴奋的新特性是增加了 SQL Server CE Managed Provider (或包装器),它为使用 .NET Compact Framework 的 Visual Basic .NET 和 C# 移动程序提供了一个互用性层。如果你已经在桌面程序中使用 ADO.NET, 那么你会觉得在 .NET Compact Framework 中 使用 SQL Server CE Managed Provider 很爽。这种编程模型 以很直觉的方式给予你和 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 支持。
  为了描述在应用程序中新的使用合并复制(Merge Replication)的受管代码包装器的强大功能,对 Synchronize 方法的一次调用将 获取整个数据库大纲以及底层数据,不必编写一行数据描述语言(DDL)语句。

开发一个应用程序

  现在让我们用一个代码工程来示范 SQL Server CE 2.0 的这些新特性。我们将用 Visual Studio .NET 和 .NET Compact  Framework 创建一个简单的 C# 智能设备程序。我们将这个程序部署到 Pocket PC 2002 模拟器上以便简 化开发和测试。
  由于是以示范为目的,我们将使用安装 NorthwindCE 例子程序时创建的数据库,使用 .NET Compact Framework SDK。如果你很熟悉 SQL Server , 那么肯定对 SQL Server 2000 中 Northwind 数据库了然于心。NorthwindCE 例子程序包括了一个名为 SetupRepl.bat 的安装脚本。它将创建一个叫 Nwind_SQLCE 的数据库的拷贝。该脚本还在运行 SQL Server 2000 的机器上安装一个带有本地分发人的发行者。此外,它从 Nwind_SQLCE 数据库创建一个名为 SQLCEReplDemoNet 的合并 发行。我们将让例子程序订阅该发行。


Figure 7 新的发行

  一旦你的 SQL Serve 实例被配置为一个复制的发行人/分发者并具备一个定义了相应许可的快照目录。那么你就可以运行 NorthwindCE 例子的 SetupRepl.bat 脚本。如果一切正常,你应该看到发行被成功创建,见 Figure 7。

应用程序回顾

  我们设计的应用程序将举例说明本文前面讨论的 SQL Server CE 2.0 新特性,比如,如何用 SqlCeReplication.Synchronize 方法实现复制。这里将演示 SQL Server 2000 Nwind_SQLCE 数据库和本地 SQL Server CE订阅数据库之间完整的 (双向)同步。以及其它特性,如新的 SqlCeException 对象和使用参数化查询。


Figure 8 Windows 窗体

  Figure 8 显示了我们为 SmartDevice 程序设计的 Windows 窗体。该程序允许通过输入名字中的姓来查询本地订阅数据库的客户表,并 在 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 Connectivity Management MMC snap-in )验证这些设置。
  代码的第一部分演示如何使用 SQL Server CE SqlCeEngine 对象来创建一个空的数据库,以及如何使用 Replication  对象来完成与现有 SQL Server 发行者针对 Nwind_SQLCE 数据库的同步。Form_Load 事件调用 DBInit 函数。它首先创建一个空的订阅数据库(如果不存在的话),并调用 DBSync 来同步 发行数据库和订阅数据库(见 Figure 9 )。
  在 DBSync 方法中,为了方便示范和说明,我们硬编码(写死)所有 Replication 对象的属性。显然你应该自己维护这些应用程序定义的数据,如 SQL 表或者 XML 文件,在 我们的例子中使用 SQL Server 身份认证。Synchronize 方法创建订阅数据库,并在该发行中获取整个数据库对象的大纲方案,包括相关索引,如 Figure 10 所示。
  一旦订阅数据库被创建,发行中的所有对象便被本地复制,从而使我们可以在断开连接的情况下仍然可以使用应用程序。不管是 SQL Server 2000 数据库的变化还是 SQL Server CE 数据库的变化通过下次调用 DBSync 方法时用复制合并解决。
  请注意在 SDE 程序中捕获异常的 try...catch...finally 构造技术。通过 ShowErrors 方法可以显示 SQL Server CE 异常的详细信息。Figure 11 中的代码示范了如何拆分 SQL Server CE 异常堆栈并 在客户端的消息框中显示。
  最后我们要解释的代码例子是 FindEmployees 方法,它在 “Find Now” 按钮的单击事件中被调用。这个方法首先实例化一个 SqlCeConnection 对象, 然后建立到本地订阅数据库的连接。
  下一步,我们构造 SqlCeCommand 对象,它由对 Employees 表的参数化查询组成,如 Figure 12 所示。注意如何使用RTRIM 内建函数来删除 FirstName 和 LastName 的尾部空格,从而可以在 ListView 控件中进行精细的格式化输出。
  使用SqlCeCommand对象的参数集合,我们可以在想要使用的搜索模式中传递带有 LIKE 操作符的 SELECT 语句。最后,我们用 SqlCeDataReader 来执行查询并 在 ListView 控件显示结果,然后关闭并释放到订阅数据库的连接。


Figure 13 Pocket PC 模拟器

  Figure 13 显示了例子程序在 Pocket PC 2002 模拟器中运行的画面。

部署应用程序要考虑的事项

  最后,我们要考虑的事情是如何部署你的应用程序。尽管 SQL Server CE 数据库引擎本身非常可靠,但由于电池容量的局限,任何它运行的设备都有可能失败。因此,你开发的任何移动 解决方案都应该考虑到灾难恢复。
  通过使用诸如 CF 卡之类的持续化内存技术可以实现持久保存。为了让用户在冷启动时能恢复数据,应规划在 CF 卡中保存应用程序数据库和可执行文件。为你的程序建立一个 CAB 文件可以 大大简化工作人员安装程序的过程。

SQL Server CE 2.随时待命

  SQL Server CE 2.0 将使你开始着手为移动设备建立自己的的企业级数据管理解决方案。与以前的版本相比,新版本的 SQL Server CE 在特性和性能方面有了质的飞跃。我们鼓励每一个人都来使用这个令人兴奋的版本,用它开始建立下一个“杀手级”的移动应用程序。你可以从网上下载 SQL Server CE 2.0,网址是 http://www.microsoft.com/sql/ce/downloads/ce20.asp

相关文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值