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)环境下。
本文来自编程入门网:http://www.bianceng.cn/database/SQLServer/200712/6359_5.htm