資料庫綜合開發實踐 (轉)

worldblog發表於2007-12-29
資料庫綜合開發實踐 (轉)[@more@]

綜合開發實踐


馬磊、張萬里

一套原來在Access上開發的桌面,網頁調閱使用,資料維護系統使用C++Builder程式設計。由於Access是一個桌面的共享型資料庫,所以在通用性和開發方面都存在一些問題。因此,需要將該系統移植到型的資料庫上。使系統既可以透過桌面維護資料,又可以有大量透過網頁調看資料(結果)。 系統初始軟體為:98第二版、Access97、C++Builder4.0、C++Builder5.0、MDAC( Data Access Component 2.6中文版)。 一、移植到的嘗試 在機器上Oracle 7.3桌面版,由於使用不熟練,所以選擇預設安裝,除選擇語言Simplified Chinese外,其他都選擇預設,一路裝下去,沒有問題,重新啟動系統。運 Easy Config,需要的資料庫別名,然後用 Net連線試驗,使用者名稱輸入system,密碼輸入manager,連線伺服器注意,不要輸入伺服器的地址,而是輸入剛才建立的別名,進去了。Ok! 此時開始測試OC,建立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的經歷 1.該系統的安裝比較簡單,若認為自己沒有能力安裝該軟體的話,還可以從網路上一個叫Triad for windows的軟體,該軟體安裝時沒有任何選項,自動安裝好MySQL。(實際上,該軟體同時還安裝好了伺服器、PHP語言直譯器,這正好符合將來把ASP的網頁換到PHP上去;另外,該軟體還同時安裝配置好了一個網頁資料庫維護工具,PHPMyAdmin對於SQL語言不算熟的人來說管理資料庫極其方便。) 2.再安裝MYODBC(即ODBC for MySQL,我的是2.5版本),注意下載該軟體時,要分清95版還是NT版的。安裝也很簡單,一路OK。好了,建立資料來源work,填好,資料庫名填mymember(這時系統提供的資料庫),進行測試,不行?改用系統自動安裝的sample-mysql資料來源連線,鏈上了。仔細檢查配置,沒有錯誤,為什麼系統自己做的資料來源可以用,我做的就不行呢?把自己建立的刪掉,把sample-mysql改名為work,再連線,嘿嘿,不行了!哈哈,原來就出在名字上,在work後面加上-mysql,再連線,好了,原來myodbc要求它的資料來源名稱必須以mysql結尾!解決了資料來源,下面開始移植原來的Access資料庫。 移植工作比較簡單,開啟Access資料庫,選中第一張表,從File選單中選擇“另存為/匯出”,選擇“另存為一個外部檔案或資料庫”,選確定,在彈出的對話方塊中的“儲存型別”下拉選單中選擇“ODBC資料庫”,又彈出一個“匯出”的對話方塊,如果打算給該資料表改名的話,現在可以輸入新的名字,然後選擇確定,在彈出的“選擇資料來源”對話方塊中點Machine Data (機器資料來源),找到自己建立的work-MySQL資料來源,按確定。此時會回到Access資料庫,如果資料表很大的話,狀態列中會有一個匯出的進度,否則,匯出已經完成。 匯出成功後,透過PHPMYADMIN檢查匯出的資料庫,結構、內容都正常。需要注意的是,如果資料表中用到了Access提供的ID(自動增量)欄位的話,需要手工在目標資料庫中修改對應欄位的屬性(這在PHPMyAdmin中很容易實現,找到該欄位後點“改變”,在該欄位的屬性最後一項“額外”的下拉選單中選擇auto_increment,然後儲存。PHPMyAdmin的介面是英文的?其實只要在安裝有PHPMyAdmin的目錄ApacheHtdocsPHPMyAdmin中找到config.inc.php檔案,搜尋require,把引號中的“english.inc.php”改成“chinese_gb.inc.php”,再去網頁中的PHPMyAdmin,嘻嘻,是不是變成中文了?其實chinese_gb.inc.php是一個檔名,就在該目錄下,你還可以把介面變成BIG5碼呢)。 3.終於把移植的工作做完了,下面開始用C++BUILDER程式設計。對資料庫使用ADO來訪問。步驟如下:在ADO標籤中選ADOTable,在主視窗上先放置一個ADOTable1,然後點選左邊觀察器( Inspector)中ConnectionString右邊的“…”圖示,選“Use Connection String”,點“Build”,在“Provr”標籤中選擇“Microsoft OLE DB Provider for ODBC s”,點“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選項很多,是為了適應各方面需要,不象或其他的資料庫那樣預設值就可以用。這個選項可能是為了一些網路上的應用,而把資料庫欄位的預設值總是假設為最小狀態,從而造成這個問題。這可能也是自由軟體的一個小缺點吧。 三、ASP訪問MySQL資料庫的問題 原來的主頁中大量使用了ASP訪問資料庫,其中典型的用法是: dim LK_CONN set LK_CONN=server.createobject("ADODB.CONNECTION") LK_CONN.open "onduty_mysql","","" ‘以上建立資料庫的連線 dim RS_NEWS set RS_NEWS = server.createobject("adodb.recordset") sql = " * FROM NewsPic" RS_NEWS.open sql,LK_CONN,1,1 ‘以上建立對錶的訪問 ‘下面顯示內容,為表達簡單,沒有格式,引號中為欄位名 =RS_NEWS("Extract") =RS_NEWS("Pic") 這一段程式碼沒有問題,實現了平滑過渡;但是有個別地方,有寫入操作,資料不能正常讀出。該段程式碼如下: dim RS_COUNT set RS_COUNT = server.createobject("adodb.recordset") RS_COUNT.open "SELECT * FROM count",LK_CONN,3,3 '訪問計數器 dim Zcount Zcount=RS_COUNT("Count") Zcount = Zcount + 1 RS_COUNT("Count").Value=Zcount RS_COUNT.Update RS_COUNT.Close 開始懷疑這一段後面有寫入操作,所以不能正確,但經過仔細比較和測試,發現問題不在是否寫入上。這一段的程式碼主要是用了ASP訪問Access資料庫時直接填入資料庫名的方法,而沒有使用SQL語句,我們把開啟資料庫的地方改為“select * from 表名”,程式遂工作正常。 結論:程式設計時應該儘量使用通用性好的方法,這樣對於系統的通用性、可移植性來說,還是很重要的。 四、ODBC的問題 在C++Builder中有的地方要用到SQL查詢,因此,有一段程式使用的是ADOQuery控制元件,本來這種用法在其他機器上用過,沒有問題,可是在這裡卻不行。具體情況如下:放置一個ADOQuery,ConnectionString屬性、TableName屬性和前面的ADOTable屬性設定一樣,Active屬性保持false,再新增一個DataSource控制元件和幾個DBText控制元件,設定同前。然後在FormCreate(表單構造)中新增如下程式碼: ADOQuery1->Active=false; ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from Names order by ID"); ADOQuery1->Active=true; while (!ADOQuery1->Eof) { ComboBox1->Items->Add(ADOQuery1->FieldByName("Name")->AsString); ADOQuery1->Next(); } //後一段 ADOQuery1->Active=false; ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from Dutys order by ID"); ADOQuery1->Active=true; while (!ADOQuery1->Eof) { ComboBox2->Items->Add(ADOQuery1->FieldByName("Duty")->AsString); ADOQuery1->Next(); } 就這麼一段程式碼,在該機器上怎麼都不能執行,系統總是提示“BOF或EOF中有一個為真。。。。”的錯誤,將註釋後面的一段刪掉,系統可以執行,但退出程式時出現錯誤,說明是帶故障執行。反覆檢視找不出程式的明顯錯誤,把程式拿到其他機器上可以透過,兩個機器的最主要差別就是ODBC的版本不同。 於是想將ODBC降為2.5英文版,找到MDAC2.5版安裝了幾次都不行,只好手工刪除了,在WINDOWS目錄中搜尋出所有字首為ODBC的檔案,然後刪除program filescommon files中的system目錄,再重新安裝MDAC(Microsoft Data Access Component 2.5英文版),再執行該程式,一切正常。 結論:不知道是MDAC2.6版本的問題,還是因為它是中文版的問題,總之,造成系統的相容性不是很好,建議大家在程式設計時也應該儘量使用已經熟悉的環境,而不要總是去嘗試太新的東東。 當然,如果是我這一段程式碼有問題,還希望有高手能出來指導。 以上是我們在一次資料庫系統的移植開發過程中出現問題和解決方法的真實記錄,雖然問題都很小,但是讓我們在開發過程中走了不少彎路,所以把它記錄下來,供大家參考,希望對朋友們的開發有所幫助。其中的問題也希望有朋友能夠指出更好的解決辦法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996151/,如需轉載,請註明出處,否則將追究法律責任。

相關文章