简介
从设备的角度,本文的讨论重点在于 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 层与服务器层的不同而有所差异。图 1 说明了 Pocket PC 中的三个层以及服务器中的三个层。
图" 1:设备和服务器中的应用程序层
.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,以及业务逻辑不是主要的考虑因素时,经常使用此选项。此选项使用 System.Data.SqlClient(英文)命名空间执行,在数据保存在本地的 XML 文件和 SQL Server CE
数据库时均可使用。
仅在服务器上交换数据:Pocket PC 应用
程序用户界面元素可以直接连接到服务器端的组件或作为使用 Pocket PC Web 浏览器的 Web 应用
程序执行。显然,这要求 Pocket PC 始终连接到服务器并需要足够的带宽。该选项可行的实例是地理环境受限制、但可以实现 WiFi
网络的情况,例如在仓库、保健机构、办公室中等等。此选项不要求将所有数据存储在 Pocket PC 本地。
在确定如何处理“如何存储数据”和“如何交换数据”这两个方面之前,必须了解或建立某些基本条件:数据特性、连接和
系统结构。
数据特性 解决方案的数据特性显示了以下重要信息:
要存储在 Pocket PC 上的静态数据及事务性数据的量:如果要存储在 Pocket PC 上的数据量少(在本例中为少于 50 至 100 kb),则数据可以存储在本地的 XML 文件中。如果数据量较大,则 SQL Server CE 将提供较高的性能及可靠性。原因是,将使用 SQL Server CE 查询引擎访问数据,该查询引擎支持具有更高性能和可
管理性的结构查询语言 (SQL)。
要与服务器交换的事务性数据的量:如果要在服务器和 Pocket PC 之间交换的事务性数据的量少(例如少于 500 kb 至 1 Mb),则可使用 Web 服务将数据作为 XML 传递。如果数据量较多,则远程数据访问和合并复制功能将提供较高的性能。原因是,SQL Server CE 客户端代理和服务器代理将执行有效的数据
压缩,而且数据在到达最终目的地之前必须经过的进程要少得多。例如,在使用远程数据访问将数据从 Pocket PC 传输到服务器时,数据无需经过 Pocket PC 端的 OLEDB CE、CLR/NET CF、SQL Server CE 数据提供
程序和 ADO.NET 层,当数据传输到服务器时,也无需经过服务器上相应的这些
程序。而是,数据可以从客户端代理直接传递到服务器代理,也可以通过 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 = frmMain.ds.Tables("Feedback").NewRow()
Else
' 查找现有行
' 使用 Select 方法查找与过滤器匹配的行
dr = frmMain.ds.Tables("Feedback").Select(expr)(0)
End If
' 设置数据行属性
dr("ID") = m_ID
dr("PlantSection") = m_PlantSection
dr("Part") = m_Part
dr("DefectScope") = m_DefectScope
dr("ScopeID") = m_ScopeID
dr("DefectType") = m_DefectType
dr("RichInk") = m_RichInk
If m_NewItem Then
' 如果有新项目,则向数据集添加行
frmMain.ds.Tables("Feedback").Rows.Add(dr)
End If
' 保存数据
frmMain.ds.AcceptChanges()
frmMain.ds.WriteXml(frmMain.dataSource)
End Sub
与服务器交换数据 下图演示了如何使用 Web 服务交换数据。在企业解决方案中,经常使用集成平台,例如 Biztalk Server(英文)。
图" 2:XML Web Service 数据交换
Pocket PC 客户端调用服务器端的 Web 服务并传递包含数据的 DataSet (ds):
Private Sub Synchronize()
Dim username As String = "JohnS"
Dim blnSuccess As Boolean
' 使用 XML Web Service 进行同步
Cursor.Current = Cursors.WaitCursor
Dim wsFeedback As New wsFeedback.feedback
blnSuccess = wsFeedback.InsertFeedback(ds, username)
Cursor.Current = Cursors.Default
End Sub
服务器端的 Web 服务接受 DataSet 并将 XML 直接传递到 SQL Server 2000 存储的过程中,该过程使用 SQLXML(英文)和 OPENXML 解析 XML 并将新数据插入适当的表格。
_
Public Function InsertFeedback(ByVal ds As DataSet, ByVal username As
String) As Boolean
Dim con As New SqlConnection(connectionstring)
Dim cmd As New SqlCommand("p_Feedback_i", con)
cmd.CommandType = CommandType.StoredProcedure
' 设置参数
Dim prmXML As SqlParameter = cmd.Parameters.Add("@XML",
SqlDbType.NText)
prmXML.Direction = ParameterDirection.Input
prmXML.Value = ds.GetXml
Dim prmUsername As SqlParameter = cmd.Parameters.Add("@Username",
SqlDbType.NVarChar)
prmUsername.Direction = ParameterDirection.Input
prmUsername.Value = username
Try
con.Open()
cmd.ExecuteNonQuery()
Catch ex As Exception
' 处理、记录并重掷错误
Throw ex
Finally
con.Close()
End Try
Return True
End Function
The stored procedure inserts the new data:
CREATE PROCEDURE p_Feedback_i
@XML ntext,
@Username nvarchar(50)
AS
SET NOCOUNT ON
DECLARE @iDoc integer
DECLARE @Error integer
/* Create XML document. */
EXEC sp_xml_preparedocument @iDoc OUTPUT, @XML
/* Insert new records */
INSERT INTO Feedback
(
FeedbackID,
PlantSection,
Part,
DefectScope,
ScopeID,
DefectType,
RichInk,
Username
)
SELECT ID,
PlantSection,
Part,
DefectScope,
ScopeID,
DefectType,
RichInk,
@Username
FROM OPENXML (@iDoc, '/DataSet/Feedback',2) WITH
(
ID uniqueidentifier,
PlantSection int,
Part int,
DefectScope int,
ScopeID nvarchar(50),
DefectType int,
RichInk nvarchar(50)
)
SELECT @Error = @@ERROR
IF (&#64;Error <> 0)
BEGIN
GOTO Errorhandler
END
/* Remove the XML document*/
EXEC sp_xml_removedocument &#64;iDoc
RETURN
Errorhandler:
IF NOT &#64;iDoc IS NULL
EXEC sp_xml_removedocument &#64;iDoc
RAISERROR (&#64;Error,16,1)
RETURN
下图演示了 SQL Server CE 远程数据访问和合并复制数据交换。
图" 3&#xff1a;数据库驱动的数据交换
小结
了解数据特性、连接和
系统结构对于确定适合的数据访问策略非常必要。请务必注意&#xff0c;Pocket PC 解决方案可用于若干种大不相同的情况。因此&#xff0c;数据访问策略很可能能够根据当前的情况和设置定义本地 XML 文件、SQL Server CE
数据库和 Web 服务的使用&#xff0c;以及 SQL Server CE 远程数据访问和合并复制的使用。
.NET Compact Framework 使
系统设计人员和
开发人员能够根据若干不同情况选择适合的数据访问方法。使用定义的数据访问策略和新的
工具箱&#xff0c;可以比较容易地将重点放在实际解决方案的优点和设计上。