VS2008下開發Sql CE2.0應用程序

Microsoft SQL 2000 Windows CE Edition(又稱爲SQL Server CE)是用於移動設備上的小型關係數據庫。SQL Server CE的發展歷程從1.0開始,當時.NET的技術框架還不能應用到移動設備上,這個時候大家在開發基於數據庫的移動應用時,採用的是Embedded Visual Tools 3.0中的VB或VC++,使用OLE DB for SQL Server CE或ADOCE訪問SQL Server CE數據庫。隨着.NET Compact Framework的推出,SQL Server CE也推出了2.0,2.0加入了更多的新功能,並在很多性能參數都有較大的提高,但更重要的是從此可以在Visual Studio .NET中通過ADO.NET訪問SQL Server CE的數據庫了。
    SQL Server CE 2.0提供了兩種基本方法來連接後端SQL Server數據庫:RDA和合並複製。RDA訪問功能支持與SQL Server 7.0(和更高版本)數據庫的連接,合併複製要求後端必須是SQL Server 2000。
    SQL Server CE與SQL Server之間可以通過RDA和Replication(合併複製)兩種方式進行數據同步。RDA適用於簡單的、不需要全功能的合併複製功能(例如數據衝突處理)的數據同步,而Replication則基於Windows Server 2000的合併複製功能,可以完成更多更復雜的功能。
  RDA全稱是Remote data access,其主要由三部分組成:SQL Server CE數據庫引擎、SQL Server CE客戶端代理和SQL Server CE服務器端代理。SQL Server CE數據庫引擎負責寫入和讀取SQL Server CE數據庫中的數據;SQL Server CE客戶端代理是RDA在移動設備上的主要組件,它實現了RDA的主要功能,我們可以通過程序調用它提供的接口以控制RDA;SQL Server CE服務器端代理位於服務器端,它與SQL Server CE客戶端代理通過HTTP協議進行通信,接收並處理SQL Server CE客戶端代理的命令。
  RDA支持三個主要的方法,他們分別是:
    Pull
    將SQL Server 2000數據庫中的表“拉”到SQL Server CE中。在調用此方法時,可以設置數據跟蹤選項,如果設置數據跟蹤,則SQL Server CE數據庫引擎會自動跟蹤對數據的插入、修改和刪除操作。
    Push
    如果在Pull時設置了數據跟蹤選項,可以將SQL Server CE中的數據“推”回到SQL Server 2000中。在SQL Server CE中對數據的任何修改都會反映到SQL Server 2000中。
    SubmitSQL
    直接向SQL Server 2000數據庫提交一個命令。
    如下圖所示:
 VS2008下開發Sql <wbr>CE2.0應用程序


    合併複製是RDA的一種替代方案,只能與SQL Server 2000配合使用。合併複製的工作組成與RDA基本類似,但是在服務器端多了一個SQL Server CE複製提供程序,也就是說SQL Server CE服務器端代理通過調用SQL Server CE複製提供程序,從SQL Server數據庫中選取一個“快照”返回給SQL Server CE客戶端代理,客戶端代理在設備上建立SQL Server CE的數據庫(訂閱數據庫)。對訂閱數據庫的任何修改都會被SQL Server CE數據庫引擎記錄下來,在調用同步方法時,可以把這些修改作用到後臺SQL Server數據庫中。
    準備開發環境
  移動服務系統採用Visual Studio .NET開發,如果要開發基於SQL Server CE的應用,只需要在項目中添加System.Data.SqlServerCe的引用,在運行和部署時系統會自動安裝兩個SQL Server CE的安裝包文件,他們是sqlce.dev.wce4.armv4.CAB和sqlce.wce4.armv4.CAB(armv4這一項會根據不同的平臺而有所不同)。sqlce.dev.wce4.armv4.CAB包括Isqlw20.exe和兩個錯誤字符串文件Ssceerror20en.dll和Msdaeren.dll,他們將被安裝到移動設備的\Program Files\SQLCE 2.0目錄;sqlce.wce4.armv4.CAB包括將被安裝到\Program Files\SQLCE 2.0目錄下的Ssce20.dll、Ssceca20.dll和安裝到\windows目錄下的Sscemw20.dll。
  isqlw20.exe是SQL Server CE的查詢分析器程序,是SQL Server CE在移動設備上的主要管理工具。
 VS2008下開發Sql <wbr>CE2.0應用程序
    通過查詢分析器,我們可以建立新的SQL Server CE數據庫,打開和關閉數據庫,在數據庫中建立、刪除和維護數據表,維護索引信息,可以輸入SQL語句並查看執行結果。
    準備SQL Server CE數據庫
  在開發中使用的SQL Server CE數據庫,可以通過三種方式建立:
    通過isqlw20.exe查詢分析器程序建立;
    通過編寫程序建立數據庫,建立表,插入必要的數據;
    通過RDA或合併複製建立。
  其中,通過RDA方式建立是最容易的方法,因爲我們可以先行在SQL Server 2000中建立數據庫,設計表結構,插入必要的數據,然後通過RDA一次性的把SQL Server 2000中的表和數據下載到移動設備上。
    1) 安裝SQL Server CE
  首先安裝SQL Server 2000,安裝完成後,還需要安裝SP3a或者最新的SP4補丁。如果希望通過RDA或合併複製與SQL Server 2000進行數據同步,那麼還必須下載SQL Server CE的補丁。SQL Server CE的補丁應該與SQL Server 2000的補丁是一致的,如果SQL Server 2000的補丁是SP3a,那麼需要下載SQL Server CE的SP3a的補丁。 SQL Server CE安裝包、SQL Server CE的SP3a補丁及SQL Server CE的SP4補丁均可在微軟的網站下載(http://www.microsoft.com/downloads/)。
  下載完成後,首先安裝SQL Server CE的安裝程序,然後再安裝SQL Server CE的補丁程序。
  2) 配置RDA
  因爲RDA使用HTTP協議實現數據通信,所以服務器端首先需要安裝並配置好IIS服務。在“開始”-->所有程序-->Microsoft SQL Server CE2.0-->Configure Connectivity Support in IIS啓動SQL Server CE連接配置程序。
 VS2008下開發Sql <wbr>CE2.0應用程序
    出現“SQL Server CE Connectivity Management”界面,雙擊“Create a Virtual Directory”打開配置嚮導。在窗口中輸入虛擬目錄的別名。
 VS2008下開發Sql <wbr>CE2.0應用程序
    在界面中選擇必要的安全設置,可以按照業務的實際需求情況選擇,如果不需要額外安全設置,可以選擇允許匿名訪問。
 
    設置完成後,打開瀏覽器,輸入:http://localhost/sqlce/sscesa20.dll ,  如果以上設置正確,應該可以出現下圖所示的文字:

VS2008下開發Sql <wbr>CE2.0應用程序
 VS2008下開發Sql <wbr>CE2.0應用程序
    3) 下載數據庫
  使用isqlw20.exe查詢分析器程序建立一個空的數據庫:MobileService.sdf。
  建立空數據庫也可以使用下面的代碼建立:
    ......
    public string LocalDatabase = "\\My Documents\\MobileService.sdf";
    ......
    if (File.Exists(LocalDatabase))
          File.Delete(LocalDatabase);
    try
    {
          SqlCeEngine engine = new SqlCeEngine("Data Source = "+LocalDatabase
                +";password=test;encrypt database=TRUE");
          engine.CreateDatabase();
          engine.Dispose();
          MessageBox.Show("ok");
     }
     catch (Exception ex)
     {
          MessageBox.Show(ex.ToString());
     }
  首先判斷\MobileService.sdf文件是否已經存在,如果已經存在,則先刪除該文件。在創建數據庫時,用的是SqlCeEngine類的CreateDatabase方法,CreateDatabase會根據LocalConnectionString屬性表示的連接字符串創建SQL Server CE數據庫。在連接字符串中的password和encrypt database 屬性是可選項,但是如果使用了encrypt database 屬性則必須包含password屬性。SqlCeEngine類還有一個很重要的方法是Compact,Compact方法用於回收SQL Server CE數據庫中浪費的空間,可用於更改SQL Server CE數據庫的排列順序、加密方式或密碼。
    需要注意的是,新建VS2008移動設備工程(如Mobile 5.0 Pocket PC模擬器)時,可以先不加任何功能代碼,僅添加引用System.data.SqlServerCe,編譯運行,系統會自動向模擬器加載需要的DLL模塊,並放在模擬器
\Program Files\Microsoft SQL Server Compact Edition\v3.5中。可以通過開始-->所有程序-->VS2008-->
Visual Studio Remote Tools-->遠程文件查看器查看,數據庫查詢分析器isqlw35.exe文件也在該目錄的CN路徑下。
 VS2008下開發Sql <wbr>CE2.0應用程序
 VS2008下開發Sql <wbr>CE2.0應用程序
    在點擊×號退出模擬器時,選擇保存當前狀態,就可以不必每次編譯程序都重新加載DLL文件了。如果想在虛擬器中刪除工程文件,可以在遠程文件查看器中刪除,但必須先使用遠程進程查看器刪除工程文件進程。刪除數據庫文件也是一樣,先要在遠程進程查看器中刪除isqlw35.exe,因爲要刪除的文件正在被使用。
    實驗pull方法:
    在上面按鈕點擊事件處理方法中添加以下代碼,實現從桌面Northwind數據庫向設備模擬器本地數據庫MobileService.sdf下載數據表結構及數據記錄:
    string rdaOleDbConnectString = "Provider=sqloledb.1;Data Source=192.168.1.17;
               Initial Catalog=Northwind; User Id=sa;Password=sa";
    SqlCeRemoteDataAccess rda = null;
    rda = new SqlCeRemoteDataAccess();
    //rda.InternetLogin = "MyLogin";
    //rda.InternetPassword = "<password>";
    rda.InternetUrl = "http://192.168.1.17/sqlce/sscesa20.dll";
    rda.LocalConnectionString = @"Data Source=\My Documents\MobileService.sdf;password=test";
    rda.Pull("Region", "Select * from Region", rdaOleDbConnectString);
    在使用SqlCeRemoteDataAccess訪問RDA時,需要指定三個重要的參數:
    SQL Server CE服務器端代理的訪問地址,通過SqlCeRemoteDataAccess類的InternetUrl屬性指定;
    連接到SQL Server CE數據庫的連接字符串,通過SqlCeRemoteDataAccess類的LocalConnectionString 屬性指定;
    SQL Server CE服務器端代理訪問SQL數據庫的連接字符串,通過調用Pull、Push或Submit方法時指定。
  另外,如果在服務器端設置時需要用戶登錄,還需要設置InternetLogin屬性和InternetPassword屬性;如果通過代理訪問服務器,還需要指定相關的代理屬性。
  Pull方法中的第一個參數是指定的本地表名稱,如果該名稱的表已經在SQL Server CE數據庫中存在,則該方法會出錯;第四個參數是設置是否打開數據跟蹤選項的,如果設置爲不打開跟蹤選項,則第二個參數指定的SQL語句可以從多個表中提取數據,否則只能從單個表中提取數據。因爲我們只是要下載數據,並不打算採用Push方法上傳數據,所以在此我們可以不指定第四個參數。
    編譯運行程序,在模擬器中提示錯誤“將數據發送到運行IIS的計算機的請求失敗.有關詳細信息請參閱HRESULT”。網上有一些解決辦法,包括關閉防火牆等,但都無法解決。分析是網絡連接問題,試着在模擬器的瀏覽器中使用http://192.168.1.17/sqlce/sscesa20.dll連接IIS,或者瀏覽百度等網頁,未成功,提示未配置網絡連接。後根據網上相關文章,執行了以下連接配置操作:
    在確保主機已連上互聯網的情況下,按以下步驟設置:
    1、打開ActiveSync ,點擊“文件”——>“連接設置”,在“允許連接到以下其中一個端口”下選擇“DMA”。
    2、打開 VS2005,點擊菜單“工具”——>“設備仿真管理器”,選擇一個 PocketPC SE 2003模擬器(或其它模擬器,但編譯時應選擇相同模擬器)。在右鍵菜單中點擊“連接”。等模擬器啓動後,再點擊“插入底座”,此時,通過ActiveSync來連接到模擬器,並進行數據同步。
    3、在模擬器中,點擊“開始”——>“設置”,點擊“連接”選項卡。
   (1)選擇“網卡”:
    “我的網卡連接到”選“默認單位設置”。
     在“點擊適配器以修改設置:”下面選“AsyncMac NDISWAN Miniport”,選中“使用服務器分配的IP地址”,點擊右上角的“ok”,提示“新設置將在下次使用適配器時應用。如果適配器當前插在設備中,請先移除,然後重新插入適配器以應用設置。”,點擊“ok”,“ok”。
    (2)在“連接”選項卡中選擇“連接”:
     在“高級”選項卡中,點擊“選擇網絡”,在“在程序自動連接到Internet時,使用:”下面選“單位設置”,默認是“Internet設置”,然後,連續點擊右上角的“ok”,“ok”,“X”返回。
    4、此時,就可以上網了。依次點擊“開始”——>“Internet Explorer”,輸入WWW.BAIDU.COM等就會出現頁面了。如還打不開網頁,可在“設備仿真器管理器”中選中該模擬器,先點擊右鍵菜單中的“移除底座”,再點擊“插入底座”,重新與ActiveSync連接一次(或在ActiveSync連接配置中執行連接操作),就沒問題了。
    連接配置好後,在模擬器的Program中再打開工程,點擊按鈕,執行上述數據庫操作,提示“內部錯誤:傳輸消息的HTTP標頭信息已壞”錯誤,檢查代碼無錯誤,借鑑網上相關文章,分析是SqlServerCe.dll的版本問題,VS2008默認添加的是C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices下3.5版本的System.Data.SqlServerCe.dll文件。
    爲解決這個問題,在其它機器中安裝了VS2005,從目錄D:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v2.0中得到2.0版本的System.Data.SqlServerCe.dll文件。重新添加引用,再編譯運行,提示:無法找到PInvoke DLL "sscemw20.dll"錯誤,分析是模擬器中sql ce執行環境(如下圖所示)版本不一致的原因。
 
    如圖所示,DLL文件和查詢分析文件均爲3.5版本(對應的DLL文件可以在C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i或其它設備類型目錄下找到)。查找sqlce聯機文檔,sqlce2.0所需dll環境包括ssce20.dll、ssceca20.dll、ssceerror20en.dll、isqlw20.exe這幾個Sql Server Ce文件(可以從CE2.0安裝目錄C:\Program Files\Microsoft SQL Server CE 2.0\Device\Arm\Sa1100中得到,包括dllregister.exe文件--可以在移動設備中用於註冊dll文件);還有安裝ce2.0的server tools時C:\Windows CE Tools\wce300\Pocket PC 2002\dataaccess31\target\arm目錄下的adoce31.dll、adoceoledb31.dll、adoxce31.dll、msdaeren.dll這幾個文件。
    在遠程文件查看器中(使用工具欄中的方向向上的上箭頭)將這些文件都下載到移動設備的windows目錄下。
    在遠程文件查看器中,從C:\Program Files\Microsoft SQL Server CE 2.0\Device\Arm\Sa1100下將dll文件註冊器dllregister.exe複製到移動設備的Windows目錄下。
    在移動設備(模擬器)中選擇“開始-->資源管理器-->windows”,點擊運行dllregister,註冊成功。測試證明這些DLL文件及註冊器都是cpu類型相關的,如這裏的arm。如果註冊不成功,可以選擇其它類型的相關文件再試一下。
    註冊之後,再試,顯示錯誤:無法找到 PInvoke DLL“sscemw20.dll”。按照前述方法,使用ActiveSync連接,錯誤依舊。按照下圖,在遠程文件查看器中手工搭建DLL環境,再試,還是不能解決。
VS2008下開發Sql <wbr>CE2.0應用程序 
    以上測試使用Mobile5.0 Pocket PC R2 Square Emulator模擬器,懷疑是因爲模擬器中保存的DLL版本衝突,又使用Mobile5.0 Pocket PC R2 Square Emulator模擬器(相當於使用了一臺新設備)試了一下,仍然顯示該異常。看來主要是因爲VS2008與VS2005不同,缺少對SQL CE2.0的支持。不像VS2005,安裝後就有對CE2.0的兼容支持,不知在CE2.0已安裝的情況下,重裝VS2008會不會添加對CE2.0的支持。
    稍感欣慰的是在vs2005環境下測試成功。請有興趣的同行也在VS2008下試一下,共同解決這一問題。
    剛接觸嵌入式,感覺開發上與桌面類似,不過環境搭建太囉嗦了,而且兼容性不好。不過,現在的軟件開發大多是集成和搭建,真希望這方面的高手多共享一下經驗,共同提高。
 
    問題解決:
    在前面測試的基礎上,利用VS2005程序(參考VS2005下的Sql CE開發測試)運行時在模擬器Windows目錄下部署的sscemw20.dll文件。
    首先在VS2005遠程文件查看工具中導出sscemw20.dll,再在VS2008遠程文件查看工具中導入sscemw20.dll,運行dllregister註冊一下,保存狀態並退出模擬器,再次編譯並測試程序,運行成功。
    這一次的測試是在另一臺機器上,由於先安裝的SQL2005,又安裝的SQL2000,在安裝SQL2000時默認實例名選項是不可選的,所以創建的實例名爲MYSQL(機器名爲XH)。按鈕點擊事件處理方法代碼如下:
    if (File.Exists(LocalDatabase))

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