用RDA方式同步SQLCE与SQL SERVER数据库

摘要:本文通过一个简单实例,介绍了在.net环境下,如何利用RDA(Remote Data Access)方式进行SQLCE与SQL SERVER之间的数据库同步,并且如何使用SQLCE的相关类创建和访问SQLCE数据库。

关键词:RDA, SQLCE, SQL SERVER

1 引言

SQL Server CE(SQLCE)是一款运行在Windows CE设备环境下的轻量级本地数据库引擎,为移动设备上偶尔连接的数据访问提供了解决方案。例如,工商管理人员在执行巡查任务前,可以用Win CE移动设备把台式计算机中的数据库(SQL Server)拷到Win CE的数据库(SQLCE)上;在执行任务时,可以在移动设备上修改记录;完成任务后,可以把移动设备上的数据库上传到台式计算机中的数据库,使这两个数据库之前的数据保持同步。Remote Data Access(RDA)方式为Win CE移动设备上SQLCE与SQL Server数据库之间的同步提供了快速而简便的解决方案。本文将通过一个实例演示如何使用RDA方式同步数据库。

2 开发环境

本文的实例程序开发环境如下:Microsoft Visual Studio 2005,编程语言C#,数据库采用

SQL Server2000,SQL Server Mobile Edition 2005(SQLCE3.0),程序测试运行环境为Windows CE5.0(使用vs上自带的Pocket PC 2003 SE 仿真程序)。

SQL Server2000必须安装SP3补丁,SQL Server Mobile Edition 2005的安装文件在Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v3.0目录下,文件名为Sqlce30setupcn.msi。安装SQL Server Mobile Edition 2005后,使用该程序菜单中的“配置Web同步向导”创建一个别名为“sqlce3”的虚拟目录,访问方式为“匿名”。注意:创建虚拟目录后,还必须打开IIS,把虚拟目录“sqlce3”的访问权限增加“写入”权限,否则RDA将同步失败。

3 程序的实现

运行SQL SERVER2000服务器管理器。打开企业管理器,创建一个新数据库,名为“ABC”,在“ABC”下创建一个数据表,表名为:“person”,表字段如下图所示:


图1  person表

运行Microsoft Visual Studio 2005,创建一个新项目,项目类型为“Visual C# ->智能设备->Windows CE5.0->设备应用程序”,项目名为“RDA_TEST”。接着是程序的编写

第一步,需引入两个名命空间:System.IO和System.Data.SqlServerCe。接着在windows CE设备上创建一个空的本地SQLCE数据库,代码如下:

 

 //创建一个空的本地数据库文件,

                string dbPathName = @"\rda.sdf";

                if (File.Exists(dbPathName))

                    File.Delete(dbPathName);

                string strCon = "Data Source =" + dbPathName + "; Password=";

                SqlCeEngine engine = new SqlCeEngine(strCon);

                engine.CreateDatabase();

                engine.Dispose();

代码中使用了SqlCeEngine类,用于创建SQLCE数据库,注意创建SqlCeEngine对象时所使用的参数,此参数为一个数据库连接字符串,注意其格式。

第二步,用SQL SERVER2000中的数据库同步SQLCE数据库。代码如下: 

                 SqlCeRemoteDataAccess rda = null;

//SQL Server所在的主机的IP

                string remoteIP = tbRemoteIP.Text.Trim();

                //SQL Server中的数据库,名为ABC

                string remoteDB = "ABC";

                //数据库ABC的用户和密码

                string user = "sa";

                string pwd = "sa";

                //本地sqlce数据库的路径和名字,该数据库存在于win CE系统下.

// dbPathName= @"\rda.sdf";

                string localDB = dbPathName;

                //本地sqlce数据库密码

                string localPwd = "";

                //要同步的数据表名

                string table = "person";

                //用于连接SQL Server数据库的字符串

                string rdaOleDbConnectString = @"Provider=SQLOLEDB;Data Source=" + remoteIP +

                             ";Initial Catalog=" + remoteDB + ";User Id=" + user + ";Password =" + pwd;

                //连接本地sqlce数据库的字符串,作为SqlCeRemoteDataAccess对象的一个参数

                string localConnectString = @"Data Source=" + localDB + ";Password=" + localPwd;

                rda = new SqlCeRemoteDataAccess();

//由于虚拟目录sqlce3设置的访问方式为匿名,所以登陆名和密码可以忽略

                rda.InternetLogin = "";

                rda.InternetPassword = "";

                rda.InternetUrl = "http://" + remoteIP + "/sqlce3/sqlcesa30.dll";

                rda.LocalConnectionString = localConnectString;

                //执行同步,SQL SERVER同步到sqlce

                //参数RdaTrackOption.TrackingOn指示SQL Server Mobile 跟踪对所提取表的所有更改。

                rda.Pull(table, "Select * from " + table, rdaOleDbConnectString, RdaTrackOption.TrackingOn);

RDA同步数据库主要是使用SqlCeRemoteDataAccess类。从别的数据库更新本地SQLCE数据库,使用SqlCeRemoteDataAccess类的Pull方法,该方法中的参数RdaTrackOption.TrackingOn,可以让SQLCE跟踪对本地数据表的更改,从而可以用SQLCE同步SQL SERVER数据库。

    第三步,对SQLCE数据库进行修改,这一步只是为了演示用SQLCE同步SQL SERVER数据库而作准备。代码如下:


                const string strDatabase = @"Data Source = \rda.sdf";

                SqlCeConnection con = null;

 con = new SqlCeConnection(strDatabase);

                con.Open();

                //修改现有记录

                string strUpdate = "update person set age=18 where name = '王一'";

                SqlCeCommand cmd = new SqlCeCommand(strUpdate, con);

                cmd.ExecuteNonQuery();

                cmd.Dispose();

                //插入一条新记录

                strUpdate = "insert into person(card_id,name,age) values(10003,'李四',23)";

                cmd = new SqlCeCommand(strUpdate,con);

                cmd.ExecuteNonQuery();

                cmd.Dispose();

第四步,用SQLCE同步SQL SERVER2000数据库,也就是把SQLCE数据库修改过的记录更新到SQL SERVER2000数据库上。代码跟第一步所列代码基本一致,但只把第一步代码的最后两行关于pull方法的代码,改为push方法代码, 代码如下: 

                //执行同步,sqlce同步到SQL Server

                //参数RdaBatchOption.BatchingOn指示SQL Server Mobile 将推入SQL Server 中的//所有行组成一批,归并到一个事务中。

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

 4 程序的运行结果

(1)图2为程序没有运行之前,SQL SERVER2000上原始数据表Person表


图2 SQL SERVER中数据库中的Person表的原始数据

(2) 图3为Pocket PC 2003 SE 仿真程序的程序运行界面,分别从上而下顺序点击三个按钮,程序运行结果如图3所示,同步后的SQL SERVER2000中的数据库ABC的person表记录如图4所示:

图3   程序在运行后的仿真器的界面显示

图4  经SLQCE同步后,SQL SERVER中数据库中的Person表中的数据

5.结论

从上述可知,使用RDA进行SQLCE与SQL SERVER进行数据库同步非常简便,而且有Microsoft Visual Studio 2005这个功能强大的开发环境,在PC上开发windows CE移动设备应用程序是非常容易的事,配合SQLCE3.0的使用,大大减少了开发数据库应用程序的工作量。

参考文献:

[1] 吕贵洲,夏明飞,李鸣. 基于Windows CE&Pocket PC的数据库应用程序开发[J]微计算机信息 ,2003,(02) .

[2] 陈福,周树杰,林小竹,史广军. 基于wince的嵌入式系统数据库访问技术研究[J]计算机系统应用 ,2004,(04) .

[3] 张华; 黄立平. SQL Server CE在手持设备上的开发应用[J]. 计算机系统应用,2003(12).

原文地址:https://www.cnblogs.com/hfzsjz/p/1891178.html