我剛剛開始開發PPC應用程式,考慮到自己對於C++語言比較熟悉,於是選擇了eVC4.0 + Pocket PC 2003 SDK開發環境。感到欣喜的是,很多東西和VC++6.0幾乎一樣,上手也很快。但是在資料庫發開方面,碰到了困難。 一開始,我選擇了WinCE內建的資料庫。實現起來也自然是非常簡單。可是,到後來,發現WinCE內建的資料庫和PC中的資料庫同步存在一定的困難。首先,ActiveSync不支援;難道要自己寫轉換介面,好像有點行不通。於是,鬱悶,一直在網上找相關資料。用Google搜,用baidu也搜。 最後,在zuilang的blog上,找到了希望的曙光。他的這篇名為“艱苦的過程:在evc中使用ADOCE的前期準備”的文章,為我指明了一條道路,可以用ADOCE來訪問Access資料庫。而Access資料庫在PC上是比較通用的資料庫類型,SQL Server 2000可以將其中的一些資料錶轉成尾碼為.mdb的Access可以訪問的資料庫。 在該blog的回帖中,又有了意外的發現,書童Macintosh 在2005-12-27 11:22:32回複的文章中,指明了EVC4.0+ADOCE3.1訪問Access資料庫的具體方法。看完文章後,激動不已,馬上著手實踐。按照Macintosh的提示,一步一步進行下來,還是比較順利。其實,Macintosh已經說的非常清楚了。我在這裡只是做了驗證性的工作而已。 1. 去微軟網站下載ADOCE3.1的安裝包,連結為: http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=en&SrcCategoryId=&SrcFamilyId=929bb147-281c-4d6e-a727-67271075fadb&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fado%2fCE-PB%2f3.1%2fWCE%2fEN-US%2fadocepbzip.exe 名字非常的繁瑣,幸好只是一個連結,直接點擊就OK了。 2. VoAdo是VOS公司做的一個使用比較方便的ADOCONNECTION和ADORECOEDSET類,下載的連結為: http://www.voscorp.com/products/developer/winmobile/voado/voado.zip 二、檔案的產生、修改和下載
1. adoce31.h和adocec31.h檔案的產生 在微軟的adocepbzip安裝包的adocepb/setup/Data Access 3.1/Program Files /DataAccess31 /INCLUDE目錄下,有這樣兩個檔案:adoce31.idl和adocec31.idl。在命令列狀態下,進入該目錄,然後執行midl adoce31.idl和midl adocec31.idl即可產生adoce31.h和adocec31.h檔案。注意,一定要進到adocepb/setup/Data Access 3.1/Program Files /DataAccess31 /INCLUDE目錄下,不然執行midl adoce31.idl和midl adocec31.idl會不成功,提示有可能是說'midl' 不是內部或外部命令,也不是可啟動並執行程式或批次檔。 2. VoAdo檔案的修改 根據adoce31.h和adocec31.h檔案,我們必須把下載的VoAdo進行適當的修改,將其中ado**30.h都改為ado**31.h。 在vorecordset.cpp檔案中,將TCHAR* CVORecordset::g_ProgID = TEXT("ADOCE.Recordset.3.0")改為TCHAR* CVORecordset::g_ProgID = TEXT("ADOCE.Recordset.3.1")。 3. 下載.dll和regsvrce.exe到目標裝置 將adocepb/setup/DataAccess3.1/Program Files /DataAccess31 /DEVICE /ARM /SA1100 /CE /RETAIL下的.dll檔案複製到PPC的/Windows目錄下。 將Program Files/Microsoft eMbedded C++ 4.0/EVC/WCE400/TARGET/ARMV4檔案夾下的regsvrce.exe檔案複製到裝置中和資料庫程式同一個檔案夾下。 三、編程中注意事項 1. dll的註冊 在我們的資料庫程式中要使用VOADO的話,首先必須註冊這些DLL,例如,在OnInitDialog()函數中,可以使用下面的語句來進行註冊: CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//adoce31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//Adoxce31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//Adocedb31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//Adoceoledb31.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//Msdaer.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//Msdaeren.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//msdadc.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); CreateProcess(_T("/RegSvrCe"),_T("/s /Windows//msdaosp.dll"),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 2. 檔案的包括 將之前我們修改完成的adoce31.h和adocec31.h檔案加入到我們的工程之中。 3. 目標裝置中檔案的放置 按照前面的要求,我們必須要把編譯產生的可執行檔.exe、操作的資料庫檔案和regsvrce.exe放置在同一檔案夾下,不然,資料庫就無法訪問。 4. 資料庫動作陳述式之前,我是按照標準SQL語言來進行操作,發現不行。例如,我要從名為Account的資料庫的PersonInfo表中選取name欄位為“張明”的所有資訊,按照標準的SQL語言,應該是這樣子的:“select * from [Account].[dbo].[ PersonInfo] where [Account].[dbo].[ PersonInfo].[name] = ‘張明’ ”,從實際的調試情況來看,如果按照這種文法的話,是無法正確open的。後來,自己胡亂猜測,實驗出來了,可以執行的語句如下:“select * from PersonInfo where name = ‘張明’ ”,當然,這隻是我自己胡亂猜測的,不知道正確的文法應該如何,這還有待查證。 一、資源需求 |