热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Microsoft.NETCompactFramework数据访问策略

简介  从设备的角度,本文的讨论重点在于 Pocket PC 平台。但是,Microsoft® .NET Compact Framework 也可以在非 Pocket PC
简介
  从设备的角度,本文的讨论重点在于 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;可以比较容易地将重点放在实际解决方案的优点和设计上。  

推荐阅读
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • 本文详细解析 Skynet 的启动流程,包括配置文件的读取、环境变量的设置、主要线程的启动(如 timer、socket、monitor 和 worker 线程),以及消息队列的实现机制。 ... [详细]
  • 深入解析Nacos服务自动注册机制
    本文将探讨Nacos服务自动注册的具体实现方法,特别是如何通过Spring事件机制完成服务注册。通过对Nacos源码的详细分析,帮助读者理解其背后的原理。 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 本项目使用Java语言开发了一个基于B/S架构的指纹识别系统,该系统能够实现指纹的高效采集与精准识别,适用于多种安全认证场景。 ... [详细]
  • 优雅地记录API调用时长
    本文旨在探讨如何高效且优雅地记录API接口的调用时长,通过实际案例和代码示例,帮助开发者理解并实施这一技术,提高系统的可观测性和调试效率。 ... [详细]
  • Node.js模块化的优势及实践
    本文探讨Node.js模块化的重要性和具体实现方式,包括其带来的代码复用性增强、可维护性提升、以及如何有效避免命名冲突等问题。 ... [详细]
  • 利用Python在DragonBoard 410c上解析GPS数据获取位置信息
    本文介绍了如何在DragonBoard 410c开发板上使用Python脚本来解析GPS报文,从而获取精确的位置信息。DragonBoard 410c集成了GPS、Wi-Fi和高性能GPU,非常适合用于各种物联网项目。 ... [详细]
  • 本文详细介绍了如何在Vue项目中集成和配置XGPlayer视频插件,包括安装步骤、基本配置以及常见问题的解决方法。 ... [详细]
  • Kubernetes 实践指南:初次体验
    本文介绍了如何通过官方提供的简易示例,快速上手 Kubernetes (K8S),并深入理解其核心概念和操作流程。 ... [详细]
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
author-avatar
建中姿吟7523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有