2 创建RDA程序
在.NET Compact Framework中有一个SqlCeRemoteDataAccess对象,提供了RDA的应用程序编程接口。SqlCeRemoteDataAccess类的命名空间是System.Data.SqlServerCe。
SqlCeRemoteDataAccess类中包括了三个最主要的方法:
1)Pull方法:从SQL Server数据库中获取一个数据表,储存在SQL Mobile数据表中
2)Push方法:将Pull方法获得的SQL Mobile数据表,在设备端的修改传回到SQL Server 数据库中
3)SubmitSql方法:将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 Tools的URL,也就是我们在IE中输入的URL。
如果Server Tools所在的IIS设置了访问用户名和密码的话,我们还需要设置InternetLogin和InternetPassword属性,这两个属性分别对应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 )
localTableName是SQL Mobile数据库中的通过Pull方法获取的数据表,这个表不能是一个SQL Mobile普通的本地数据表;也不能是Pull方法设置为TrackingOff时获取的表。
oleDBConnectionString和Pull方法中同名的参数作用相同,用于连接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方法提交一个insert、update、delete和create table等SQL语句,但是提交select的SQL语句将没有任何效果。
oleDBConnectionString与Pull、Push方法中的同名属性相同,用于设置SQL Server数据库的连接字符串。