SQL Mobile的RDA数据同步开发

 目前很多软件厂商针对移动设备的数据库同步解决方案,这些方案主要分为两种:第一种,是针对某种特定数据库提供的数据同步方案,比如 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数据库的连接字符串。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值