SQL Mobile的RDA数据同步开发

转载 2007年10月15日 12:34:00
 目前很多软件厂商针对移动设备的数据库同步解决方案,这些方案主要分为两种:第一种,是针对某种特定数据库提供的数据同步方案,比如SQL SeverRDAReplicationOracle LiteSybase SQL Anywhere等;第二种是ISV开发的针对不同数据库的数据同步方案。

SQL Mobile支持两种数据同步的方法:Remote data accessRDA)和Replication。这两种方法都支持从远程的SQL Server服务器中下载数据到设备端的SQL Mobile数据库中,在本地对数据进行浏览和修改,再将修改结果更新到SQL Server服务器中。

RDAReplication都需要配置SQL Mobile Server Tools,也就是说,必须要有一个运行IISWeb ServerServer Tools的主要作用是将移动设备通过网络发送的数据库访问请求,转发给SQL Server数据库,并将结果集发送回移动设备中。

移动设备使用RDAReplication时,SQL Mobile只需要连接IIS上的Server Tools。而数据同步需要HTTPHTTPS的网络连接支持。网络连接可以是无线局域网(Wi-Fi)、无线网或通过AtiveSync连接的PC网络。

1 RDA架构

RDA使用了SQL Mobile中的三个组件:SQL Mobile Database EngineSQL Mobile Client AgentSQL Mobile Server AgentRDA的运行过程如下图:

SQL Mobile Database Engine用于管理存储于SQL Mobile数据库中的数据。如果这些数据来自于远程SQL Server数据库,并且在调用Pull操作时设置了跟踪改变的选项,Database Engine还将跟踪整个程序运行过程中数据表的变化情况,比如insertupdatedelete等操作。Database Engine将为每条记录维护更新记录。如果SQL Server数据表建有索引,那么RDA也支持在SQL Mobile数据表中建立索引。

SQL Mobile Client Agent是运行于Windows Mobile上的一个组件,主要负责与Server Agent的通讯。Client Agent实现了RDA对象的API,应用程序通过API来操作RDA

RDAPull方法被调用时,Client Agent会通过HTTPSQL Mobile Server Agent发送请求。当接收到从SQL Server返回的结果集后,Client Agent将结果集保存到SQL Mobile数据库中。

Push方法被调用时,Client AgentSQL Mobile数据库中取出所有插入、更新和删除的记录,将它们发送给Server Agent

SubmitSQL方法,将SQL语句通过HTTP发送给Server Agent

RDA使用运行于IIS上的Server Agent作为SQL Server数据库与SQL Mobile数据之间的通信代理。Server Agent负责监听来自SQL Mobile Client AgentHTTP请求。Server Agent使用临时消息文件(*.in*.out)来管理SQL ServerSQL Mobile的交换数据。

Client Agent调用Pull方法时,Server Agent会收到请求,然后通过OLE DB连接SQL Server数据库,调用SQL语句。Server Agent会将返回的结果集通过HTTP发送给Client Agent

Push方法,Server Agent会收到所有被客户端修改的记录,通过OLE DB连接SQL Server数据库,然后对SQL Server中相应记录进行insertupdatedelete操作。如果发生错误,Server Agent会向Client Agent报告这个错误。

SubmitSQL方法,接受指定的SQL语句,通过OLE DB连接SQL Server数据库,然后调用SQL语句。

2 创建RDA程序

.NET Compact Framework中有一个SqlCeRemoteDataAccess对象,提供了RDA的应用程序编程接口。SqlCeRemoteDataAccess类的命名空间是System.Data.SqlServerCe

SqlCeRemoteDataAccess类中包括了三个最主要的方法:

1Pull方法:从SQL Server数据库中获取一个数据表,储存在SQL Mobile数据表中

2Push方法:将Pull方法获得的SQL Mobile数据表,在设备端的修改传回到SQL Server 数据库中

3SubmitSql方法:将SQL语句直接提交到SQL Server数据库中执行。

2.1 Pull方法

在调用Pull方法之前,我们必须创建SqlCeRemoteDataAccess的对象,并对RDA的属性进行设置。

我们通过下面的一段代码来说明如何创建一个SqlCeRemoteDataAccess对象,并调用Pull方法。

// Connection String to the SQL Server. string rdaOleDbConnectString = "Provider=sqloledb; Data Source=MySqlServer;Initial Catalog=Northwind; " + "User Id=username;Password = <password>"; // Initialize RDA Object. SqlCeRemoteDataAccess rda = null; try { //Try the Pull Operation. rda = new SqlCeRemoteDataAccess(); rda.InternetLogin = "MyLogin"; rda.InternetPassword = "<password>"; rda.InternetUrl = "<http://www.northwindtraders.com/sqlce/sscesa20.dll>"; rda.LocalConnectionString = @"Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0;Data Source=/ssce.sdf"; rda.Pull( "Employees", "Select * from Employees", rdaOleDbConnectString, RdaTrackOption.TrackingOnWithIndexes, "ErrorTable"); } catch (SqlCeException) { //Use you own Error Handling Routine. } finally { //Dispose of the RDA Object. rda.Dispose(); }

SqlCeRemoteDataAccess对象创建后,我们需要设置InternetUrl属性,该属性是指定SQL Mobile Server ToolsURL,也就是我们在IE中输入的URL

如果Server Tools所在的IIS设置了访问用户名和密码的话,我们还需要设置InternetLoginInternetPassword属性,这两个属性分别对应IIS访问用户名和密码。除此之外,我们还需要设置LocalConnectionString属性,该属性提供一个SQL Mobile的数据库连接字符串。我们可以不必在连接字符串中设置Provider,这样系统就会默认使用SQL Mobile数据库支持库了,但是Data Source必须指定SQL Mobile数据库在Windows Mobile设备中的绝对路径。

大家也可以看到,SqlCeRemoteDataAccess对象中的属性主要是和SQL Mobile数据库、SQL Mobile Server Tools有关,而没有SQL Server的相关设置,我们稍后会进行说明。

SqlCeRemoteDataAccess对象所需要的属性被设置完成后,我们就可以调用Pull方法了。Pull方法最多可以包括五个参数,我们依次来看一下函数原型和相关参数:

public void Pull ( string localTableName, string sqlSelectString, string oleDBConnectionString, RdaTrackOption trackOption, string errorTable )

localTableName参数指定了在SQL Mobile数据库中的数据表名称,该数据表用于存放Pull方法从SQL Server获得的数据。

sqlSelectString参数,用于设置从SQL Server获取的数据集的SQL语句,我们可以通过这个SQL语句设置获得结果集是某个数据表的子集。我们可以通过设置WHERE子句来获得某个数据表的子集。

oleDBConnectionString参数指定SQL Server的数据库连接字符串,在Pull方法指定SQL Server数据库连接字符串,而不是在SqlCeRemoteDataAccess对象属性中设置,是因为我们可以在一个SqlCeRemoteDataAccess对象中指定从多个SQL Server中获取数据。

trackOption参数用于SQL Mobile数据表的数据跟踪设置,指定RdaTrackOption枚举变量。

errorTable属性用于设置一个数据表的名称,该数据表用于在Push方法的时候发生数据冲突时,会将数据错误信息放到Error Table中。

下面我们来讨论下trackOption参数,如果从SQL Server中获取的数据需要在设备端进行修改,并且要将修改结果提交回SQL Server数据库的话,就需要将该参数设置为TrackingOn;如果数据不需要提交回SQL Server数据库的话,就需要设置为TrackingOff,比如需要获得商品的价格信息,而这些信息不需要在设备端修改,我们就可以设置为TrackingOff,这样做还可以节省一部分空间。

TrackingOff

 

 

 

SQL Mobile不会跟踪本地数据改变,PRIMARY KEY约束在本地创建

TrackingOffWithIndexes

 

 

 

SQL Mobile不会跟踪本地数据改变,存在于SQL Server数据表中的索引和PRIMARY KEY约束会被在本地表创建。

TrackingOn

 

 

 

SQL Mobile会跟踪本地数据改变,PRIMARY KEY约束在本地创建,这是默认设置

TrackingOnWithIndexes

 

 

 

SQL Mobile会跟踪本地数据改变,存在于SQL Server数据表中的索引和PRIMARY KEY约束会被在本地表创建。

这里需要注意的是,Pull方法一次只可以从SQL Server获取一个数据表,而设置的本地表名称,SQL Mobile数据库不能存在同名的数据表,所以每次通过Pull方法获取新的数据时,必须先删除上次Pull方法获得的本地表。

2.2 Push方法

我们下边来看一下Push方法。Push方法用来把SQL Mobile本地表的修改结果传递回SQL Server数据库中。下面的代码相对比较简单:

rda.Push("MyLocalTable", rdaOleDbConnectString, RdaBatchOption.BatchingOn);

我们先来看下函数原型与参数:

public void Push ( string localTableName, string oleDBConnectionString, RdaBatchOption batchOption )

localTableNameSQL Mobile数据库中的通过Pull方法获取的数据表,这个表不能是一个SQL Mobile普通的本地数据表;也不能是Pull方法设置为TrackingOff时获取的表。

oleDBConnectionStringPull方法中同名的参数作用相同,用于连接SQL Server的数据库连接字符串,该字符串必须和对应Pull方法的oleDBConnectionString相同。

batchOption参数是用于设置我们的数据是否批量提交,该参数是一个RdaBatchOption枚举变量。如果设置成BatchingOff,被修改的数据将被逐条提交,如果其中某些数据产生冲突,将不会影响另外数据的提交,但是这样的问题是数据量会增加,这也是默认选项;BatchingOn会将所有发生改变的数据记录批量提交。

2.3 SubmitSQL方法

最后来看SubmitSQL方法,该方法会将一个SQL语句提交到SQL Server服务器中执行。为什么还需要这样的方法呢。如果我们需要写一个数据捕捉的程序,将捕捉到的数据提交到SQL Server服务器中。如果使用Pull方法从SQL Server获取一个数据表,然后向其中添加新数据,然后再使用Push方法提交到SQL Server中,这样十分麻烦,所以直接使用SubmitSql方法直接将SQL语句提交到SQL Server中执行就可以了。

rda.SubmitSql( "CREATE TABLE MyRemoteTable (colA int)", rdaOleDbConnectString);

我们来看SubmitSQL的原型:

public void SubmitSql ( string sqlString, string oleDBConnectionString )

sqlString参数需要指定SQL语句,该SQL语句是在远程SQL Server中执行,而不是在SQL Mobile数据库中执行。另外由于SubmitSql方法不会返回一个结果集,所以我们可以用SubmitSql方法提交一个insertupdatedeletecreate tableSQL语句,但是提交selectSQL语句将没有任何效果。

oleDBConnectionStringPullPush方法中的同名属性相同,用于设置SQL Server数据库的连接字符串。

SQL Delta同步数据

先对比结构,只有结构对比完之后才可以对比数据。
  • yang472024191
  • yang472024191
  • 2014年06月11日 17:49
  • 538

关于数据同步的几种实现

关于数据同步的几种实现 概述 关于数据同步主要有两个层面的同步,一是通过后台程序编码实现数据同步,二是直接作用于数据库,在数据库层面实现数据的同步。通过程序编码实现数据同步,其主要的实现思路很容易理解...
  • xuemoyao
  • xuemoyao
  • 2013年11月04日 09:15
  • 67799

R语言绘图实战:RDA冗余分析

#载入vegan包 library(vegan) #读取“样本-物种”文件 sp
  • sinat_38163598
  • sinat_38163598
  • 2017年05月13日 10:36
  • 4937

数据库同步的两种方法,SQL JOB和发布订阅

上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作。发布订阅份为两个步骤:1、发布。2、订阅。首先在数据源数据库服务器上对需要同步的...
  • hanchaoqi
  • hanchaoqi
  • 2013年01月17日 15:13
  • 1569

SQL Server数据导入Redis的简单方法

最近看了一篇讲如何把mysql中的数据导入到redis中,是通过命令行完成的。 文中作者用的是linux系统,思路是通过sql语句来构建redis的命令,通过mysql执行sql语句,把sql语句...
  • yupeigu
  • yupeigu
  • 2016年05月25日 14:47
  • 6186

SQL应用之跨数据库服务器数据库结构同步实现(MSSQL)

跨数据库服务器数据库结构同步,这里包含以下几个方面的问题:①跨数据库服务器:两个数据库分别位于不同的数据库服务器;②数据库结构:由数据库对象(表、视图、存储过程、函数等)组成的数据库结构;③同步:要求...
  • gezhonglei2007
  • gezhonglei2007
  • 2016年09月17日 17:51
  • 1979

SQL Server 2008 R2 主从数据库同步

一、准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB ...
  • czp11210
  • czp11210
  • 2016年11月05日 16:56
  • 1112

SQL Server(2008)中通过触发器进行数据同步的设置说明

今天做了这个的测试,记录下来。希望对有需要的朋友有点帮助。
  • xiaochongzi520
  • xiaochongzi520
  • 2014年01月16日 16:07
  • 1461

sqlce3.5 使用RDA组件与sqlserver2005同步数据

系统环境: win7旗舰版,iis版本为7.5,vs2005,wince6.0,SQL Server CE 3.5 实现步骤:          一:在电脑端安装IIS,特别注意勾选"ISAPI ...
  • yjg428
  • yjg428
  • 2013年09月14日 23:00
  • 2065

SQL SERVER2000利用数据库复制技术 实现数据同步更新

复制的概念 Microsoft? SQL Server? 2000 的复制是在数据库之间对数据和数据库对象进行复制 和分发并进行同步以确保其一致性的一组技术。 使用复制可以将数据分发到不同位置,...
  • hdhai9451
  • hdhai9451
  • 2013年08月31日 21:50
  • 1147
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Mobile的RDA数据同步开发
举报原因:
原因补充:

(最多只允许输入30个字)