热门标签 | 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;可以比较容易地将重点放在实际解决方案的优点和设计上。  

推荐阅读
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
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社区 版权所有