四、 环境配置及程序实现
很多网友不能成功运行SQL Server CE 的RDA和合并复制程序很大程度都是因为配置问题。正确安装SQL CE和配置IIS及SQL Server 2000是运行SQL CE数据库程序的关键。安装SQL Server CE时需要注意,安装程序在安装服务器工具时会抱错,这是SQL Server CE本身与SQL Server 2000存在兼容性及安全性问题,解决的办法是先忽略,然后更新桌面SQL Server 2000数据库引擎到SP3或SP4,根据所做的更新版本还需要运行相应的更新程序SQL Server CE 2.0 SP3 For SQL Server 2000 SP3或者SQL Server CE 2.0 SP4 For SQL Server 2000 SP4,这样SQL Server CE的服务器组件就可以顺利地安装到了计算机中,然后运行其附带的Configure Connectivity Support in IIS创建IIS虚拟目录sqlce,其指向的实际本地路径为:C:\Program Files\Microsoft SQL Server CE 2.0\Server\,可以更改该文件夹路径为其它,但该文件夹下必须放置着SQL Server CE Server Agent的相关文件,比如:sscesa20.dll。下一步需要配置存取该虚拟目录的用户、权限及身份验证方式,我们可以选择匿名访问,并接受IIS的默认来宾用户,一般以IUSR开头,在存取权限中需要选中读取和目录浏览两项,见下图。
配置就绪后,我们可以检测SQL Server CE Server Agent工作是否正常,启动IE,在地址栏中输入 Http://localhost/sqlce/sscesa20.dll,或者将localhost改为实际的主机名称,浏览器返回“SQL Server CE Server Agent”说明SQL Server CE Server Agent运行正常,IIS配置正确。
接下来需要配置SQL Server 2000,我们需要在桌面SQL Server 2000中创建名为Task数据库,包含Employee员工表和ItemList任务表,为ItemList表中ID字段创建主键和索引,并且添加在IIS中设置的可以访问sqlce虚拟目录和其下文件的IIS来宾用户,这样该用户就可通过IIS来存取SQL Server 2000的数据库了。
Pocket PC和桌面PC网络连接可以使用Microsoft ActiveSync,也可以使用无线WiFi 802.1x。由于我们是与单台桌面PC连接,需要在其上同时安装IIS和SQL Server 2000。实际使用得知SQL Server CE 2.0运行在桌面服务环境的服务器工具与SQL Server 2000在连接上存在一定问题,微软对此问题的解决办法是:首先将SQL Server 2000打上SP3或者SP4,同时根据SQL Server 2000的补丁版本,还需要给SQL Server CE 2.0打上用于SQL Server 2000 SP3或者 SQL Server 2000 SP4的补丁,SQL Server CE的服务器组件才能顺利工作,上述更新和补丁程序在微软网站上都有下载。
配置结束后启动Visual Studio .Net 2003,单击文件 – 新建 – 项目 - Visual Basic 项目 -
智能设备应用程序,创建空项目。整个程序由一个Form窗体MainForm组成,其上包含两个Panel组件和一个Button组件,我们把程序分为两个主界面,一个为登录界面,一个为操作界面,分别对应两个Panel控件,当登录用Panel显示时,操作用Panel则隐藏,当登录成功后两个Panel的显示属性则相反。Button控件提供退出操作。登录用Panel上面包含几个TextBox和Button控件供填写SQL Server CE Server Agent 的Web地址、要连接的
远程SQL Server 2000服务器名称、能够存取桌面SQL Server数据库的用户名和密码,以及要登录的员工ID和密码等必要的登录
信息。运行在实际设备上的图示如下:
当单击”登录”按钮时,程序首先在智能设备上创建SQL Server CE本地数据库sdf文件,本程序下载的所有表都保存在该数据库中:
…… ' 根据指定的sdf文件路径创建本地的用户数据库文件用于RDA的PULL en = New SqlCeEngine("Data Source=" & LocalDatabaseFile) en.CreateDatabase() …… |
然后创建RDA对象的实例,并填写用于和远程SQL Server CE Server Agent 通信的相关信息。下载允许登录PPC的合法的用户信息数据到本地表:
rda.Pull("UserInfo", "Select * from employee where emp_id='" + EMPId + "' and emp_password='" + Password + "'", RemoteConnString, RdaTrackOption.TrackingOff) |
UserInfo表返回的是就是登录用户的记录信息,请注意RdaTrackOption的值为TrackingOff,因为我们没有在PPC上设置更改用户信息的操作,所以没必要跟踪该表。如果用户名和密码验证通过,UserInfo表的记录数就为1,也就是大于0,否则没有记录,然后我们通过使用SqlCeConnection、SqlCeDataAdapter、SqlCeDataReader以及DataTable返回UserInfo表的所有记录,一旦记录数为0则不允许登录:
If dtLocalUserInfo.Rows.Count > 0 Then '验证通过 CurrentLogonUserID = dtLocalUserInfo.Rows(0).Item("emp_id").ToString CurrentLogonUserName = dtLocalUserInfo.Rows(0).Item("emp_name").ToString Return True Else '验证失败,返回false Return False End If |
登录成功后根据登录用户名只返回其相关的任务记录,并将任务记录保存在名为” itemlist”的表中:
rda.Pull("itemlist", "Select * from itemlist where emp_id='" + EMPId + "'", RemoteConnString, RdaTrackOption.TrackingOnWithIndexes) |
由于RDA不会保持记录锁,push操作会无条件的将所有数据改动都应用到SQL Server中,所以容易引起当前数据库的其他用户的更新数据的丢失。我们需要按照一定的筛选条件过滤我们感兴趣的记录,以便获取唯一且不同于其它用户返回的记录集。TrackingOnWithIndexes说明在PPC上对任务状态的更改将会被跟踪,在后面的同步操作时会根据跟踪的变化将更改更新到远程数据库中。
任务记录成功获得后,我们隐藏登录用Panel而将操作用Panel置于顶层用于对任务记录的添加、状态更新、删除已经同步操作等。
用listview控件来显示任务记录,我们遍历返回的itemlist表,每一条记录创建一个ListViewItem,并添加到listview中以便显示:
While Reader.Read Dim ls As New ListViewItem(Reader.Item("ID").ToString) ls.SubItems.Add(Trim(Reader.Item("TaskName").ToString)) ls.SubItems.Add(Trim(Reader.Item("TaskContent").ToString)) ls.SubItems.Add(Reader.Item("Finished").ToString) lvItemList.Items.Add(ls) End While |
向SQL Server CE表添加、删除和更新操作同桌面数据库操作相似,例如添加操作:
selectCMD.CommandText = "insert into itemlist (ID,TaskName,TaskContent,Finished,EMP_ID) values (" + _ TextBox1.Text + "," + _ "'" + taskname + "'" + "," + _ "'" + taskcontent + "'" + "," + "0" + "," + "'" + CurrentLogonUserID + "'" + ")" selectCMD.CommandTimeout = 30 conn.Open() selectCMD.ExecuteNonQuery() |
对智能
设备本地表进行更新后还需要将改动保存到远程SQL Server中去,我们使用如下代码:
rda.Push("itemlist", RemoteConnString, RdaBatchOption.BatchingOn) |
将更改成批推入远程
SQL Server中,注意:只有跟踪的提取表才可以执行Push操作。运行在实际设备上的图示如下:
该程序成功运行在Windows XP SP2和
Dell X3i(Pocket PC 2003)环境下。
查看本文来源