简介
从设备的角度本文的讨论重点在于 Pocket PC 平台但是Microsoft® NET Compact Framework 也可以在非 Pocket PC 的 Microsoft Windows® CE NET 设备上运行此处讨论的 NET Compact Framework 相关概念也可以适用于这些设备
NET Compact Framework 数据访问策略涉及许多方面关键方面是连接其他各个方面都取决于此由于 Pocket PC 既可以联机使用也可以脱机使用因此数据访问策略需要定义如何
在联机时管理和使用远程服务器上的数据
在脱机时存储和使用数据
在 Pocket PC 从先前的脱机状态进入联机状态时交换数据
在数据访问策略环境中建立标准术语非常重要标准术语的建立对于如何定义 Pocket PC 和服务器之间的数据交换尤其重要从概念的角度交换数据的方法有两种数据同步和数据传输
数据同步支持双向的数据交换并实现确保两端数据相同的功能在很多情况下同一数据可以在 Pocket PC 处于脱机状态时在多个地方进行修改然后与服务器同步因此同步功能常常需要包含沖突解决功能以处理在断开连接的 Pocket PC 返回到联机状态以同步数据时发生的并发性问题下面的示例说明了四处走动的推销员在脱机状态下实地更新订单时发生的这种情况在推销员同步更改之前一位联机客户服务代表也对同一订单进行更新设计周到的沖突解决机制能够在出现沖突时决定应采取何种措施例如基于同步的角色或时间使四处走动的推销员覆盖客户服务代表或者系统是否应通知用户或用户组出现了沖突
数据传输也支持双向的数据交换但是却没有用于确保两端数据相同的功能也没有沖突解决在很多情况下数据传输是有效的方法并且不需要数据同步数据传输的示例有将静态引用数据从服务器传输到 Pocket PC仅将新收集的数据从 Pocket PC 传输到服务器以及将明确引入和引出或分段到单个用户的数据传输到 Pocket PC 或从 Pocket PC 传出并在数据被引出或由特定用户拥有时在服务器上将其标为只读数据
在这一点上术语数据同步和数据传输反应了它们真实的含义而在同时包含这两个术语时则使用数据交换
数据访问策略的各个方面
在根本上NET Compact Framework 数据访问策略涉及两个方面
如何在 Pocket PC 上存储数据从应用程序的角度来看数据可以保存在关系数据库(例如 Microsoft SQL Server; CE)本地文件(例如通常通过 DataSets 管理的 XML 文件)以及在应用程序终止时配置的基于会话的内存内数据结构中
如何与服务器交换数据Pocket PC 和服务器之间数据交换的执行方式根据进行通信的 Pocket PC 层与服务器层的不同而有所差异图 说明了 Pocket PC 中的三个层以及服务器中的三个层
图 设备和服务器中的应用程序层NET Compact Framework 自身包含的数据交换选项包括
Pocket PC 数据库对服务器数据库Pocket PC 数据库与服务器数据库直接交换数据此选项在涉及很少业务逻辑或不涉及业务逻辑以及在数据量很大的情况下有效并使用 SQL Server CE 的远程数据访问(英文)和合并复制(英文)功能来执行如果要求进行数据同步而不仅仅是数据传输则合并复制功能可以提供在服务器端的 SQL Server 调节程序中执行的内部沖突解决
Pocket PC 组件对服务器组件Pocket PC 应用程序与服务器上的组件进行通信此选项能使业务逻辑(作为 Web 服务 [英文] 执行)成为数据交换的一部分当数据保存在本地的 XML 文件或 SQL Server CE 数据库中时均可使用此选项
Pocket PC 组件对服务器数据库Pocket PC 直接连接到服务器数据库在 Pocket PC 应用程序需要管理远程数据库的大量数据而不必将数据放入 Pocket PC以及业务逻辑不是主要的考虑因素时经常使用此选项此选项使用 SystemDataSqlClient(英文)命名空间执行在数据保存在本地的 XML 文件和 SQL Server CE 数据库时均可使用
仅在服务器上交换数据Pocket PC 应用程序用户界面元素可以直接连接到服务器端的组件或作为使用 Pocket PC Web 浏览器的 Web 应用程序执行显然这要求 Pocket PC 始终连接到服务器并需要足够的带宽该选项可行的实例是地理环境受限制但可以实现 WiFi 网络的情况例如在仓库保健机构办公室中等等此选项不要求将所有数据存储在 Pocket PC 本地
在确定如何处理如何存储数据和如何交换数据这两个方面之前必须了解或建立某些基本条件数据特性连接和系统结构
数据特性
解决方案的数据特性显示了以下重要信息
要存储在 Pocket PC 上的静态数据及事务性数据的量如果要存储在 Pocket PC 上的数据量少(在本例中为少于 至 kb)则数据可以存储在本地的 XML 文件中如果数据量较大则 SQL Server CE 将提供较高的性能及可靠性原因是将使用 SQL Server CE 查询引擎访问数据该查询引擎支持具有更高性能和可管理性的结构查询语言 (SQL)
要与服务器交换的事务性数据的量如果要在服务器和 Pocket PC 之间交换的事务性数据的量少(例如少于 kb 至 Mb)则可使用 Web 服务将数据作为 XML 传递如果数据量较多则远程数据访问和合并复制功能将提供较高的性能原因是SQL Server CE 客户端代理和服务器代理将执行有效的数据压缩而且数据在到达最终目的地之前必须经过的进程要少得多例如在使用远程数据访问将数据从 Pocket PC 传输到服务器时数据无需经过 Pocket PC 端的 OLEDB CECLR/NET CFSQL Server CE 数据提供程序和 ADONET 层当数据传输到服务器时也无需经过服务器上相应的这些程序而是数据可以从客户端代理直接传递到服务器代理也可以通过 Internet Information Server 直接传递到远程 SQL Server
请务必注意如果数据被存储为本地 XML 文件则可以使用 Web 服务进行数据交换如果数据存储在 SQL Server CE 中也可能使用 Web 服务而不是远程数据访问和合并复制其原因包括使用了业务逻辑和现有的系统结构策略(可能适合)
连接
解决方案的连接方面涉及 Pocket PC 联机时的可用带宽以及 Pocket PC 的联机频率问题这些因素有时可以作为前提条件给定有时也可以进行定义和控制
由于 XML 通常包含大量未经压缩的重复元数据因此对于相同的数据Web 服务比 SQL Server CE 远程数据访问和合并复制需要更多的带宽但事实表明当需要交换大量数据时调用的是远程数据访问和合并复制的功能设置另外在数据交换频率低时也经常使用这两种方法这可能会提高需要交换的数据量这意味着在现实中SQL Server CE 远程数据访问和合并复制常用于高带宽的情况而 Web 服务常用于低带宽的情况因此在使用 Web 服务时聊天式(大量小请求)设计比区块式(少量大请求)设计更适合
系统结构
系统结构方面涉及系统集成的总体问题移动解决方案可以看成是与现行系统或现行系统的扩展和核心部分相连接的独立解决方案然而 Pocket PC 解决方案通常不是独立的因为它们需要与其他系统进行通信因此如果没有系统结构则必须定义系统结构如果已有系统结构则应遵守
目前大多数系统均作为技术界面驱动的多层解决方案实现服务器端的应用程序已被组件化以便启用代码的重复使用以及业务逻辑和数据的分离并提高可管理性XML 和 Web 服务的使用继续推动该项开发并且 NET Compact Framework 应用程序由于对 XML 和 Web 服务消费的本地支持而完全适应此结构
另两种系统集成实现方式是使用队列的异步消息和数据库驱动集成通过将 Web 服务界面用于服务器端的 MSMQ 队列或通过在 Pocket PC 和服务器之间使用 Web 服务以及在服务器和后备办公室系统之间使用队列NET Compact Framework 应用程序可以遵守这些实现方式数据库驱动的集成是 SQL Server CE 的固有部分这一点我们已经讨论过
代码演练
让我们看一些演示如何执行上面提到的选项的示例代码源代码来自一个称为 Feedback Anyplace 的示例应用程序(用在一个称为 Architect Webcast:Designing Integrated Pocket PC Applications with NET Compact Framework [英文] 的 Webcast 中)演示了质检人员可以如何使用 Pocket PC 在捕获并报告生产中的问题该示例需要使用 IntelliProg 的 RichInk 控制才能运行您可以下载源代码包括 NET Compact Framework 应用程序Web 服务和数据库组件该示例项目是数据传输而非数据同步的示例
在 Pocket PC 上存储数据
下列代码演示了如何将类似于类的属性包存储到 DataSet 和本地 XML 文件中
Public Sub Save()
保存新项目或更新现有项目
Dim ds as DataSet
Dim dr As DataRow
Dim expr As String = ID = + m_ID +
If m_NewItem Then
将新行添加到表
dr = frmMaindsTables(Feedback)NewRow()
Else
查找现有行
使用 Select 方法查找与过滤器匹配的行
dr = frmMaindsTables(Feedback)Select(expr)()
End If
设置数据行属性
dr(ID) = m_ID<