一套原來在Access上開發的案頭系統,網頁調閱使用ASP編程,資料維護系統使用C++Builder編程。由於Access是一個案頭的共用型資料庫,所以在通用性和網路開發方面都存在一些問題。因此,需要將該系統移植到伺服器型的資料庫上。使系統既可以通過案頭軟體維護資料,又可以有大量使用者通過網頁調看資料(結果)。
系統初始軟體為:Windows98第二版、Access97、C++Builder4.0、C++Builder5.0、MDAC(Microsoft Data Access Component 2.6中文版)。
一、移植到Oracle的嘗試
在機器上安裝Oracle 7.3案頭版,由於使用不熟練,所以選擇預設安裝,除選擇語言Simplified Chinese外,其他都選擇預設,一路裝下去,沒有問題,重新啟動系統。運行Net Easy Config,配置需要的資料庫別名,然後用SQL Net串連實驗,使用者名稱輸入system,密碼輸入manager,串連伺服器注意,不要輸入伺服器的地址,而是輸入剛才建立的別名,進去了。Ok!
此時開始測試ODBC,建立ODBC資料來源。此時,ODBC中有兩個有關Oracle的驅動,一個是Microsoft ODBC for Oracle,另一個是Oracle 7.3,這是該公司自己開發的驅動。可是怎麼選擇驅動程式都不行,不是提示Oracle的驅動沒有安裝,就是說某個DLL檔案找不到。真是說不行,就不行,行也不行。
多次實驗均無效。。。。
檢查AUTOEXEC.BAT檔案,其中有ORACLE的路徑。那末,問題會在什麼地方呢?本著懷疑一切的態度,在MSDOS方式下隨手輸入了一個PATH命令,奇怪,裡面居然沒有ORACLE的路徑!開啟AUTOEXEC.BAT檔案一琢磨,路徑是不是太長?把路徑中的其他目錄全都注釋掉,重啟系統,嘿!資料來源可以建立了,而且兩個驅動程式哪個都能夠工作。原來由於系統中安裝了C++Builder的兩個版本,而該軟體的目錄又特別深,造成PATH環境變數的溢出,而在WINDOWS環境下啟動時的提示我們看不到,所以沒有發現這個問題。現在知道了,重新調整一下AUTOEXEC.BAT檔案,保留一個C++Builder的路徑。以後得記住安裝C++Builder時最好自己指定一個目錄,這樣可以縮短路徑。這可是說行就行,不行也行。
經過對Oracle的測試,發現將Access資料庫直接移植到Oracle資料庫中時,對文字欄位(TEXT,MEMO)的遷移總有問題,且該系統使用、安裝過於複雜,對機器配置的要求也太高,而該系統需要安裝的使用者較多,且使用者水平參差不齊,所以決定改用現在在自由軟體界比較流行的免費資料庫系統MySQL。
二、移植到MySQL的經曆
1.該系統的安裝比較簡單,若認為自己沒有能力安裝該軟體的話,還可以從網路上下載一個叫PHPTriad for windows的軟體,該軟體安裝時沒有任何選項,自動安裝好MySQL。(實際上,該軟體同時還安裝好了APACHE伺服器、PHP語言解譯器,這正好符合將來把ASP的網頁換到PHP上去;另外,該軟體還同時安裝配置好了一個網頁資料庫維護工具PHPMyAdmin,PHPMyAdmin對於SQL語言不算熟的人來說管理資料庫極其方便。)
2.再安裝MYODBC(即ODBC for MySQL,我的是2.5版本),注意下載該軟體時,要分清95版還是NT版的。安裝也很簡單,一路OK。好了,建立資料來源work,填好IP地址,資料庫名填mymember(這時系統提供的資料庫),進行測試,不行?改用系統自動安裝的sample-mysql資料來源串連,鏈上了。仔細檢查配置,沒有錯誤,為什麼系統自己做的資料來源可以用,我做的就不行呢?把自己建立的刪掉,把sample-mysql改名為work,再串連,嘿嘿,不行了!哈哈,原來就出在名字上,在work後面加上-mysql,再串連,好了,原來myodbc要求它的資料來源名稱必須以mysql結尾!解決了資料來源,下面開始移植原來的Access資料庫。
移植工作比較簡單,開啟Access資料庫,選中第一張表,從File菜單中選擇“另存新檔/匯出”,選擇“另存新檔一個外部檔案或資料庫”,選確定,在彈出的對話方塊中的“檔案類型”下拉選單中選擇“ODBC資料庫”,又彈出一個“匯出”的對話方塊,如果打算給該資料表改名的話,現在可以輸入新的名字,然後選擇確定,在彈出的“選擇資料來源”對話方塊中點Machine Data Source(機器資料來源),找到自己建立的work-MySQL資料來源,按確定。此時會回到Access資料庫,如果資料表很大的話,狀態列中會有一個匯出的進度,否則,匯出已經完成。
匯出成功後,通過PHPMYADMIN檢查匯出的資料庫,結構、內容都正常。需要注意的是,如果資料表中用到了Access提供的ID(自動增量)欄位的話,需要手工在目標資料庫中修改對應欄位的屬性(這在PHPMyAdmin中很容易實現,找到該欄位後點“改變”,在該欄位的屬性最後一項“額外”的下拉選單中選擇auto_increment,然後儲存。PHPMyAdmin的介面是英文的?其實只要在安裝有PHPMyAdmin的目錄Apache\Htdocs\PHPMyAdmin中找到config.inc.php檔案,搜尋require,把引號中的“english.inc.php”改成“chinese_gb.inc.php”,再去調用網頁中的PHPMyAdmin,嘻嘻,是不是變成中文了?其實chinese_gb.inc.php是一個檔案名稱,就在該目錄下,你還可以把介面變成BIG5碼呢)。
3.終於把移植的工作做完了,下面開始用C++BUILDER編程。對資料庫使用ADO來訪問。步驟如下:在ADO控制項標籤中選ADOTable,在主視窗上先放置一個ADOTable1,然後點擊左邊對象觀察器(Object Inspector)中ConnectionString右邊的“…”表徵圖,選“Use Connection String”,點“Build”,在“Provider”標籤中選擇“Microsoft OLE DB Provider for ODBC Drivers”,點“Next>>”按鈕,在“specify the source of data”中選“use data source name”,從下拉選單中選擇資料來源work-MySQL,點“Test Connection”,顯示串連成功,確定,OK,返回,在對象觀察器中Table Name屬性點下拉選單,選擇需要的資料表。再從Data Access控制項標籤中選DataSource,在主視窗上放置一個DataSource1,在對象觀察器中DataSet屬性點下拉選單,選擇ADOTable1,下面進行介面輸出的布局,選擇“Data Controls”控制項標籤中的DBEdit根據需要放置,並把DataSource屬性設定為DataSource1 ,DataField屬性設定為所需要的欄位名。如此放置幾個欄位,最後從“Data Controls”控制項標籤中選“DBNavigator”放在視窗上。再把ADOTable1的Active屬性改為true,咦,怎麼有的欄位顯示成(MEMO),先不管他,運行程式,輸入一些內容,點擊提交,怎麼沒了?有的欄位還縮短了,多試幾次,發現新輸入的內容不能超過原來的長度,那麼原來是空的欄位就永遠沒法輸入內容了。這是怎麼回事?這種用法肯定沒有問題,以前在Access資料庫上就是這麼用的。那麼,就是MySQL的ODBC有問題,退出C++Builder,開啟資料來源的選項仔細分析,其中第一項vaaaa很象。把它選中,確定,重新運行C++Builder,再運行程式,一切OK。原來MySQL這樣的自由軟體,其ODBC選項很多,是為了適應各方面需要,不象微軟或其他的資料庫那樣預設值就可以用。這個選項可能是為了最佳化一些網路上的應用,而把資料庫欄位的預設值總是假設為最小狀態,從而造成這個問題。這可能也是自由軟體的一個小缺點吧。