RDA實現SQL CE與SQL Server間數據存取

 

  一、 概述

  PPC程序與桌面PC進行通信的編程方式目前有兩種,1、利用Socket編程與桌面程序進 行通信;2、利用RDA和Replication(複製)進行數據庫編程來完成與桌面SQL Server數據庫的存取。利用Socket編程實際上就是通過TCP/IP協議與桌面PC進行通信,它可以很方便的傳輸一般類型的數據,譬如:字符串、 整數以及字節等,但是如果需要傳輸類型化的數據則需要程序員自己去封裝,而且若想由智能設備從桌面數據庫引擎中返回指定數據庫表的數據,必須編寫桌面接口 服務程序來查詢數據並將結果通過Socket返回給智能設備。那麼如何才能在Pocket PC上做到像在桌面PC上一樣存取本地數據庫甚至是遠程桌面PC的數據庫呢?通過在智能設備Pocket PC上運行的SQL Server CE 我們便可以輕鬆存取放置在Pocket PC上的SQL Server CE數據庫,還可以通過SQL Server CE中的RDA或者合併複製快速實現從智能設備上存取遠程桌面SQL Server2000的數據庫。
 
  二、技術要點

   SQL Server CE 全名是Microsoft SQL Server 2000 Windows CE Edition,它爲移動智能設備和嵌入式設備提供了一種存取輕量級數據庫的解決方案。通過使用Microsoft Visual Studio .NET 或者 Microsoft eMbedded Visual Tools等開發工具,我們可以將SQL Server的企業數據管理能力擴展到基於Windows CE的智能平臺之上。SQL Server CE可以應用到三種典型的環境中:

   1、開發環境,即用於開發基於SQL Server CE程序的桌面PC,該桌面PC必須包括Microsoft Visual Studio .NET或者Microsoft eMbedded Visual Tools 3.0和Pocket PC SDK開發工具;

  2、客戶端環境,是用於運行基於SQL Server CE程序的Pocket PC設備,當設備沒有可用的網絡連接時,可以使用Microsoft ActiveSync來與服務器環境桌面PC進行線纜連接;

   3、服務器環境,是運行Microsoft Internet Information 服務(IIS) 和Microsoft SQL Server實例的計算機,可以將IIS和SQL Server部署在同一臺已算機上,也可以分別配置到多臺計算上。RDA和合並複製都需要通過IIS來與SQL Server進行通信。

  SQL Server CE 依靠幾個組件來與SQL Server進行數據交換:

  1、數據庫引擎用於管理基於Windows CE設備上的數據存儲,並且跟蹤數據庫記錄的添加、更新和刪除操作;

  2、SQL Server CE Client Agent 是運行在Windows CE設備上的用於連接的組件,包括複製對象、RDA對象和數據庫引擎,使用這些對象應用程序可以控制與SQL Server的連接;

   3、SQL Server CE Server Agent 處理來自SQL Server CE Client Agent的Http請求。當SQL Server CE Client Agent通過Http協議向SQL Server CE Server Agent發送請求時,SQL Server CE Server Agent會與SQL Server進行連接並將查詢的記錄集通過Http協議再傳回給SQL Server CE Client Agent,所有數據的傳送都要依賴IIS來完成。

  由上述通信過程我們知道,SQL Server CE 的遠程連接和存取需要使用Web傳輸協議Http 或者Https,SQL Server CE Client Agent必須運行在Windows CE設備上,SQL Server CE Server Agent則運行在桌面PC上,而且該計算機還必須安裝有IIS以便使用RDA 或合併複製來和SQL Server通信。SQL Server CE 支持的網絡連接有以太網、無線局域網和無線廣域網。通過使用Microsoft ActiveSync,Pocket PC設備可以使用串口、紅外線或者USB直接與桌面PC上的SQL Server連接,也可以進行SQL Server CE與桌面SQL Server 的連接測試。

  Remote Data Access (RDA)對象是Microsoft SQL Server 2000 Windows CE (SQL Server CE)用於可編程存取遠程Microsoft SQL Server 2000 或者Microsoft SQL Server version 7.0 數據庫的ActiveX控件,我們可以使用RDA存取遠程數據庫就像是在桌面PC上操作本地數據庫一樣簡單。

  三、設計思路

  我們將使用Visual Basic .Net創建“任務管理程序 For PPC”項目來展示如何利用RDA來完成PPC與PC間的數據庫連接和存取。一名客戶經理助理或銷售人員必須知道今天都要完成哪些任 務,上級領導對自己都有哪些安排等等信息,雖然可以使用Email或者IM程序進行接收和查看,但是如果我們只拿Pocket PC設備能否完成任務的接收呢?答案當然是肯定的。

   在Pocket PC上我們創建數據庫客戶端程序,編寫RDA程序需要用到.net壓縮框架中System.Data.SqlServerCe命名空間中的 SqlCeRemoteDataAccess類。從桌面PC查詢並獲取記錄集到Pocket PC上我們需要使用rda.pull方法,pull有多種重載版本,我們使用最常用的版本,localTableName 是將要接收提取的 SQL Server 記錄的 SQL Server CE 本地表的名稱。sqlSelectString 爲任何有效的 Transact-SQL 語句,包括 Select 語句和存儲過程,它們指定從遠程 SQL Server 數據庫中提取哪些表、列和記錄以存儲在 SQL Server CE 數據庫中。 oledbConnectionString 是連接 SQL Server 數據庫時使用的 OLE DB 連接字符串。 trackOption 表示 SQL Server CE 是否跟蹤對提取表所做的更改,以及提取的表上存在的索引是否轉到具有主鍵約束的設備。我們使用的版本爲:

….
rda.Pull("itemlist", "Select * from itemlist where emp_id=’" + EMPId + "’", RemoteConnString, RdaTrackOption.TrackingOnWithIndexes)
….

  TrackingOnWithIndexes指示 SQL Server CE跟蹤對所提取表的所有更改。在本地表上同時創建 SQL Server 表上存在的索引和主鍵約束。

   編寫PPC數據庫程序所用到的控件和類與編寫桌面數據庫程序具有相似性,SqlCeConnection對應 SqlConnection,SqlCeDataAdapter對應SqlDataAdapter,SqlCeCommand對應SqlCommand 等,SqlCeConnection 對象表示到智能設備上的數據源的一個連接,需要向ConnectionString傳遞有效的連接字符串,譬如:

LocalConnString = "Data Source=Program FileTaskRDA.sdf"

   Sdf文件是SQL Server CE 數據庫文件。 SQL Server CE 只支持一次一個連接,但是多個命令可以共享同一連接。在SqlCeConnection連接打開的情況下,可以創建SqlCeCommand對象,並設置 用於執行或返回記錄集的SQL語句的Commandtext屬性,SqlCeCommand 調用的 SQL 語句不支持傳遞參數的命名參數,必須使用問號 (?) 佔位符,也可以自定義組成SQL語句的字符串,例如:

……
Dim conn As New SqlCeConnection
conn.ConnectionString = LocalConnString
Dim selectCMD As SqlCeCommand = New SqlCeCommand
selectCMD.CommandText = "update itemlist set finished=1 where id=" + id
conn.Open()
selectCMD.ExecuteNonQuery()
……

  應用程序可以使用rda.push方法將 SQL Server CE 跟蹤提取表中的更改傳送回原始 SQL Server 表。localTableName 是指已經從 SQL Server 提取的記錄的 SQL Server CE 本地表的名稱。oledbConnectionString 爲連接 SQL Server 數據庫時使用的 OLE DB 連接字符串。batchOption 表示正發送回 SQL Server 表的更改是組成一批共用同一事務,還是分別應用。我們的版本需要將所有行組成一批,歸併到一個事務推入SQL Server。

rda.Push("itemlist", RemoteConnString, RdaBatchOption.BatchingOn)
四、 環境配置及程序實現

   很多網友不能成功運行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 FilesMicrosoft SQL Server CE 2.0Server,可以更改該文件夾路徑爲其它,但該文件夾下必須放置着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)環境下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章