实现SQLCE与SQLServer间数据存取.docx
《实现SQLCE与SQLServer间数据存取.docx》由会员分享,可在线阅读,更多相关《实现SQLCE与SQLServer间数据存取.docx(8页珍藏版)》请在冰豆网上搜索。
实现SQLCE与SQLServer间数据存取
本文介绍如何利用RDA(RemoteDataAccess远程数据存取)实现掌上电脑PocketPC(简称PPC)上的SQLServerCE2.0与桌面SQLServer2000数据库间的数据存取。
我们将采用VisualBasic.Net2003进行智能设备端的程序开发。
一、概述
PPC程序与桌面PC进行通信的编程方式目前有两种,1、利用Socket编程与桌面程序进行通信;2、利用RDA和Replication(复制)进行数据库编程来完成与桌面SQLServer数据库的存取。
利用Socket编程实际上就是通过TCP/IP协议与桌面PC进行通信,它可以很方便的传输一般类型的数据,譬如:
字符串、整数以及字节等,但是如果需要传输类型化的数据则需要程序员自己去封装,而且若想由智能设备从桌面数据库引擎中返回指定数据库表的数据,必须编写桌面接口服务程序来查询数据并将结果通过Socket返回给智能设备。
那么如何才能在PocketPC上做到像在桌面PC上一样存取本地数据库甚至是远程桌面PC的数据库呢?
通过在智能设备PocketPC上运行的SQLServerCE我们便可以轻松存取放置在PocketPC上的SQLServerCE数据库,还可以通过SQLServerCE中的RDA或者合并复制快速实现从智能设备上存取远程桌面SQLServer2000的数据库。
二、技术要点
SQLServerCE全名是MicrosoftSQLServer2000WindowsCEEdition,它为移动智能设备和嵌入式设备提供了一种存取轻量级数据库的解决方案。
通过使用MicrosoftVisualStudio.NET或者MicrosofteMbeddedVisualTools等开发工具,我们可以将SQLServer的企业数据管理能力扩展到基于WindowsCE的智能平台之上。
SQLServerCE可以应用到三种典型的环境中:
1、开发环境,即用于开发基于SQLServerCE程序的桌面PC,该桌面PC必须包括MicrosoftVisualStudio.NET或者MicrosofteMbeddedVisualTools3.0和PocketPCSDK开发工具;
2、客户端环境,是用于运行基于SQLServerCE程序的PocketPC设备,当设备没有可用的网络连接时,可以使用MicrosoftActiveSync来与服务器环境桌面PC进行线缆连接;
3、服务器环境,是运行MicrosoftInternetInformation服务(IIS)和MicrosoftSQLServer实例的计算机,可以将IIS和SQLServer部署在同一台已算机上,也可以分别配置到多台计算上。
RDA和合并复制都需要通过IIS来与SQLServer进行通信。
SQLServerCE依靠几个组件来与SQLServer进行数据交换:
1、数据库引擎用于管理基于WindowsCE设备上的数据存储,并且跟踪数据库记录的添加、更新和删除操作;
2、SQLServerCEClientAgent是运行在WindowsCE设备上的用于连接的组件,包括复制对象、RDA对象和数据库引擎,使用这些对象应用程序可以控制与SQLServer的连接;
3、SQLServerCEServerAgent处理来自SQLServerCEClientAgent的Http请求。
当SQLServerCEClientAgent通过Http协议向SQLServerCEServerAgent发送请求时,SQLServerCEServerAgent会与SQLServer进行连接并将查询的记录集通过Http协议再传回给SQLServerCEClientAgent,所有数据的传送都要依赖IIS来完成。
由上述通信过程我们知道,SQLServerCE的远程连接和存取需要使用Web传输协议Http或者Https,SQLServerCEClientAgent必须运行在WindowsCE设备上,SQLServerCEServerAgent则运行在桌面PC上,而且该计算机还必须安装有IIS以便使用RDA或合并复制来和SQLServer通信。
SQLServerCE支持的网络连接有以太网、无线局域网和无线广域网。
通过使用MicrosoftActiveSync,PocketPC设备可以使用串口、红外线或者USB直接与桌面PC上的SQLServer连接,也可以进行SQLServerCE与桌面SQLServer的连接测试。
RemoteDataAccess(RDA)对象是MicrosoftSQLServer2000WindowsCE(SQLServerCE)用于可编程存取远程MicrosoftSQLServer2000或者MicrosoftSQLServerversion7.0数据库的ActiveX控件,我们可以使用RDA存取远程数据库就像是在桌面PC上操作本地数据库一样简单。
三、设计思路
我们将使用VisualBasic.Net创建“任务管理程序ForPPC”项目来展示如何利用RDA来完成PPC与PC间的数据库连接和存取。
一名客户经理助理或销售人员必须知道今天都要完成哪些任务,上级领导对自己都有哪些安排等等信息,虽然可以使用Email或者IM程序进行接收和查看,但是如果我们只拿PocketPC设备能否完成任务的接收呢?
答案当然是肯定的。
在PocketPC上我们创建数据库客户端程序,编写RDA程序需要用到.net压缩框架中System.Data.SqlServerCe命名空间中的SqlCeRemoteDataAccess类。
从桌面PC查询并获取记录集到PocketPC上我们需要使用rda.pull方法,pull有多种重载版本,我们使用最常用的版本,localTableName是将要接收提取的SQLServer记录的SQLServerCE本地表的名称。
sqlSelectString为任何有效的Transact-SQL语句,包括SELECT语句和存储过程,它们指定从远程SQLServer数据库中提取哪些表、列和记录以存储在SQLServerCE数据库中。
oledbConnectionString是连接SQLServer数据库时使用的OLEDB连接字符串。
trackOption表示SQLServerCE是否跟踪对提取表所做的更改,以及提取的表上存在的索引是否转到具有主键约束的设备。
我们使用的版本为:
TrackingOnWithIndexes指示SQLServerCE跟踪对所提取表的所有更改。
在本地表上同时创建SQLServer表上存在的索引和主键约束。
编写PPC数据库程序所用到的控件和类与编写桌面数据库程序具有相似性,SqlCeConnection对应SqlConnection,SqlCeDataAdapter对应SqlDataAdapter,SqlCeCommand对应SqlCommand等,SqlCeConnection对象表示到智能设备上的数据源的一个连接,需要向ConnectionString传递有效的连接字符串,譬如:
Sdf文件是SQLServerCE数据库文件。
SQLServerCE只支持一次一个连接,但是多个命令可以共享同一连接。
在SqlCeConnection连接打开的情况下,可以创建SqlCeCommand对象,并设置用于执行或返回记录集的SQL语句的Commandtext属性,SqlCeCommand调用的SQL语句不支持传递参数的命名参数,必须使用问号(?
)占位符,也可以自定义组成SQL语句的字符串,例如:
应用程序可以使用rda.push方法将SQLServerCE跟踪提取表中的更改传送回原始SQLServer表。
localTableName是指已经从SQLServer提取的记录的SQLServerCE本地表的名称。
oledbConnectionString为连接SQLServer数据库时使用的OLEDB连接字符串。
batchOption表示正发送回SQLServer表的更改是组成一批共用同一事务,还是分别应用。
我们的版本需要将所有行组成一批,归并到一个事务推入SQLServer。
四、环境配置及程序实现
很多网友不能成功运行SQLServerCE的RDA和合并复制程序很大程度都是因为配置问题。
正确安装SQLCE和配置IIS及SQLServer2000是运行SQLCE数据库程序的关键。
安装SQLServerCE时需要注意,安装程序在安装服务器工具时会抱错,这是SQLServerCE本身与SQLServer2000存在兼容性及安全性问题,解决的办法是先忽略,然后更新桌面SQLServer2000数据库引擎到SP3或SP4,根据所做的更新版本还需要运行相应的更新程序SQLServerCE2.0SP3ForSQLServer2000SP3或者SQLServerCE2.0SP4ForSQLServer2000SP4,这样SQLServerCE的服务器组件就可以顺利地安装到了计算机中,然后运行其附带的ConfigureConnectivitySupportinIIS创建IIS虚拟目录sqlce,其指向的实际本地路径为:
C:
ProgramFilesMicrosoftSQLServerCE2.0Server,可以更改该文件夹路径为其它,但该文件夹下必须放置着SQLServerCEServerAgent的相关文件,比如:
sscesa20.dll。
下一步需要配置存取该虚拟目录的用户、权限及身份验证方式,我们可以选择匿名访问,并接受IIS的默认来宾用户,一般以IUSR开头,在存取权限中需要选中读取和目录浏览两项,见下图。
配置就绪后,我们可以检测SQLServerCEServerAgent工作是否正常,启动IE,在地址栏中输入Http:
//localhost/sqlce/sscesa20.dll,或者将localhost改为实际的主机名称,浏览器返回“SQLServerCEServerAgent”说明SQLServerCEServerAgent运行正常,IIS配置正确。
接下来需要配置SQLServer2000,我们需要在桌面SQLServer2000中创建名为Task数据库,包含Employee员工表和ItemList任务表,为ItemList表中ID字段创建主键和索引,并且添加在IIS中设置的可以访问sqlce虚拟目录和其下文件的IIS来宾用户,这样该用户就可通过IIS来存取SQLServer2000的数据库了。
PocketPC和桌面PC网络连接可以使用MicrosoftActiveSync,也可以使用无线WiFi802.1x。
由于我们是与单台桌面PC连接,需要在其上同时安装IIS和SQLServer2000。
实际使用得知SQLServerCE2.0运行在桌面服务环境的服务器工具与SQLServer2000在连接上存在一定问题,微软对此问题的解决办法是:
首先将SQLServer2000打上SP3或者SP4,同时根据SQLServer2000的补丁版本,还需要给SQLServerCE2.0打上用于SQLServer2000SP3或者SQLServer2000SP4的补丁,SQLServerCE的服务器组件才能顺利工作,上述更新和补丁程序在微软网站上都有下载。
配置结束后启动VisualStudio.Net2003,单击文件–新建–项目-VisualBasic项目-智能设备应用程序,创建空项目。
整个程序由一个Form窗体MainForm组成,其上包含两个Panel组件和一个Button组件,我们把程序分为两个主界面,一个为登录界面,一个为操作界面,分别对应两个Panel控件,当登录用Panel显示时,操作用Panel则隐藏,当登录成功后两个Panel的显示属性则相反。
Button控件提供退出操作。
登录用Panel上面包含几个TextBox和Button控件供填写SQLServerCEServerAgent的Web地址、要连接的远程SQLServer2000服务器名称、能够存取桌面SQLServer数据库的用户名和密码,以及要登录的员工ID和密码等必要的登录信息。
运行在实际设备上的图示如下:
当单击”登录”按钮时,程序首先在智能设备上创建SQLServerCE本地数据库sdf文件,本程序下载的所有表都保存在该数据库中:
然后创建RDA对象的实例,并填写用于和远程SQLServerCEServerAgent通信的相关信息。
下载允许登录PPC的合法的用户信息数据到本地表:
UserInfo表返回的是就是登录用户的记录信息,请注意RdaTrackOption的值为TrackingOff,因为我们没有在PPC上设置更改用户信息的操作,所以没必要跟踪该表。
如果用户名和密码验证通过,UserInfo表的记录数就为1,也就是大于0,否则没有记录,然后我们通过使用SqlCeConnection、SqlCeDataAdapter、SqlCeDataReader以及DataTable返回UserInfo表的所有记录,一旦记录数为0则不允许登录:
登录成功后根据登录用户名只返回其相关的任务记录,并将任务记录保存在名为”itemlist”的表中:
由于RDA不会保持记录锁,push操作会无条件的将所有数据改动都应用到SQLServer中,所以容易引起当前数据库的其他用户的更新数据的丢失。
我们需要按照一定的筛选条件过滤我们感兴趣的记录,以便获取唯一且不同于其它用户返回的记录集。
TrackingOnWithIndexes说明在PPC上对任务状态的更改将会被跟踪,在后面的同步操作时会根据跟踪的变化将更改更新到远程数据库中。
任务记录成功获得后,我们隐藏登录用Panel而将操作用Panel置于顶层用于对任务记录的添加、状态更新、删除已经同步操作等。
用listview控件来显示任务记录,我们遍历返回的itemlist表,每一条记录创建一个ListViewItem,并添加到listview中以便显示:
向SQLServerCE表添加、删除和更新操作同桌面数据库操作相似,例如添加操作:
对智能设备本地表进行更新后还需要将改动保存到远程SQLServer中去,我们使用如下代码:
该程序成功运行在WindowsXPSP2和DellX3i(PocketPC2003)环境下。