熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

數據庫綜合開發實踐

2013-11-13 12:36:38  來源: SQL語言 

  一套原來在Access上開發的桌面系統網頁調閱使用ASP編程數據維護系統使C++Builder編程由於Access是一個桌面的共享型數據庫所以在通用性和網絡開發方面都存在一些問題因此需要將該系統移植到服務器型的數據庫上使系統既可以通過桌面軟件維護數據又可以有大量用戶通過網頁調看數據(結果)

  系統初始軟件為Windows第二版AccessC++BuilderC++BuilderMDAC(Microsoft Data Access Component 中文版)

  一移植到Oracle的嘗試

  在機器上安裝Oracle 桌面版由於使用不熟練所以選擇默認安裝除選擇語言Simplified Chinese外其他都選擇默認一路裝下去沒有問題重新啟動系統運行Net Easy Config配置需要的數據庫別名然後用SQL Net連接試驗用戶名輸入system密碼輸入manager連接服務器注意不要輸入服務器的地址而是輸入剛才建立的別名進去了Ok!

  此時開始測試ODBC建立ODBC數據源此時ODBC中有兩個有關Oracle的驅動一個是Microsoft ODBC for Oracle另一個是Oracle 這是該公司自己開發的驅動可是怎麼選擇驅動程序都不行不是提示Oracle的驅動沒有安裝就是說某個DLL文件找不到真是說不行就不行行也不行

  多次試驗均無效

  檢查AUTOEXECBAT文件其中有ORACLE的路徑那末問題會在什麼地方呢?本著懷疑一切的態度在MSDOS方式下隨手輸入了一個PATH命令奇怪裡面居然沒有ORACLE的路徑!打開AUTOEXECBAT文件一琢磨路徑是不是太長?把路徑中的其他目錄全都注釋掉重啟系統嘿!數據源可以建立了而且兩個驅動程序哪個都能夠工作原來由於系統中安裝了C++Builder的兩個版本而該軟件的目錄又特別深造成PATH環境變量的溢出而在WINDOWS環境下啟動時的提示我們看不到所以沒有發現這個問題現在知道了重新調整一下AUTOEXECBAT文件保留一個C++Builder的路徑以後得記住安裝C++Builder時最好自己指定一個目錄這樣可以縮短路徑這可是說行就行不行也行

  經過對Oracle的測試發現將Access數據庫直接移植到Oracle數據庫中時對文本字段(TEXTMEMO)的遷移總有問題且該系統使用安裝過於復雜對機器配置的要求也太高而該系統需要安裝的用戶較多且使用者水平參差不齊所以決定改用現在在自由軟件界比較流行的免費數據庫系統MySQL

  二移植到MySQL的經歷

  該系統的安裝比較簡單若認為自己沒有能力安裝該軟件的話還可以從網絡上下載一個叫PHPTriad for windows的軟件該軟件安裝時沒有任何選項自動安裝好MySQL(實際上該軟件同時還安裝好了APACHE服務器PHP語言解釋器這正好符合將來把ASP的網頁換到PHP上去;另外該軟件還同時安裝配置好了一個網頁數據庫維護工具PHPMyAdminPHPMyAdmin對於SQL語言不算熟的人來說管理數據庫極其方便)

  再安裝MYODBC(即ODBC for MySQL我的是版本)注意下載該軟件時要分清版還是NT版的安裝也很簡單一路OK好了建立數據源work填好IP地址數據庫名填mymember(這時系統提供的數據庫)進行測試不行?改用系統自動安裝的samplemysql數據源連接鏈上了仔細檢查配置沒有錯誤為什麼系統自己做的數據源可以用我做的就不行呢?把自己建立的刪掉把samplemysql改名為work再連接嘿嘿不行了! 哈哈原來就出在名字上在work後面加上mysql再連接好了原來myodbc要求它的數據源名稱必須以mysql結尾!

  解決了數據源下面開始移植原來的Access數據庫 移植工作比較簡單打開Access數據庫選中第一張表從File菜單中選擇另存為/導出選擇另存為一個外部文件或數據庫選確定在彈出的對話框中的保存類型下拉選單中選擇ODBC數據庫又彈出一個導出的對話框如果打算給該數據表改名的話現在可以輸入新的名字然後選擇確定在彈出的選擇數據源對話框中點Machine Data Source(機器數據源)找到自己建立的workMySQL數據源按確定此時會回到Access數據庫如果數據表很大的話狀態欄中會有一個導出的進度否則導出已經完成

  導出成功後通過PHPMYADMIN檢查導出的數據庫結構內容都正常需要注意的是如果數據表中用到了Access提供的ID(自動增量)字段的話需要手工在目標數據庫中修改對應字段的屬性(這在PHPMyAdmin中很容易實現找到該字段後點改變在該字段的屬性最後一項額外的下拉選單中選擇auto_increment然後保存PHPMyAdmin的界面是英文的?其實只要在安裝有PHPMyAdmin的目錄Apache\Htdocs\PHPMyAdmin中找到configincphp文件搜索require把引號中的englishincphp改成chinese_gbincphp再去調用網頁中的PHPMyAdmin嘻嘻是不是變成中文了?其實chinese_gbincphp是一個文件名就在該目錄下你還可以把界面變成BIG碼呢)

  終於把移植的工作做完了下面開始用C++BUILDER編程對數據庫使用ADO來訪問

  步驟如下

  在ADO控件標簽中選ADOTable在主窗口上先放置一個ADOTable然後點擊左邊對象觀察器(Object Inspector)中ConnectionString右邊的圖標Use Connection StringBuildProvider標簽中選擇Microsoft OLE DB Provider for ODBC DriversNext>>按鈕specify the source of data中選use data source name從下拉選單中選擇數據源workMySQLTest Connection顯示連接成功確定OK返回在對象觀察器中Table Name屬性點下拉選單選擇需要的數據表

  再從Data Access控件標簽中選DataSource在主窗口上放置一個DataSource在對象觀察器中DataSet屬性點下拉選單選擇ADOTable下面進行界面輸出的布局選擇Data Controls控件標簽中的DBEdit根據需要放置並把DataSource屬性設置為DataSource DataField屬性設置為所需要的字段名如此放置幾個字段最後從Data Controls控件標簽中選DBNavigator放在窗口上再ADOTable的Active屬性改為true怎麼有的字段顯示成(MEMO)先不管他運行程序輸入一些內容點擊提交怎麼沒了?有的字段還縮短了多試幾次發現新輸入的內容不能超過原來的長度那麼原來是空的字段就永遠沒法輸入內容了這是怎麼回事?這種用法肯定沒有問題以前在Access數據庫上就是這麼用的那麼就是MySQL的ODBC有問題退出C++Builder打開數據源的選項仔細分析其中第一項vaaaa很象把它選中確定重新運行C++Builder再運行程序一切OK

  原來MySQL這樣的自由軟件其ODBC選項很多是為了適應各方面需要不象微軟或其他的數據庫那樣默認值就可以用這個選項可能是為了優化一些網絡上的應用而把數據庫字段的默認值總是假設為最小狀態從而造成這個問題這可能也是自由軟件的一個小缺點吧

  ASP訪問MySQL數據庫的問題

  原來的主頁中大量使用了ASP訪問數據庫其中典型的用法是

  dim LK_CONN

  set LK_CONN=servercreateobject(ADODBCONNECTION)

  LK_CONNopen onduty_mysqlroot

  以上建立數據庫的連接

  dim RS_NEWS

  set RS_NEWS = servercreateobject(adodbrecordset)

  sql = SELECT * FROM NewsPic

  RS_NEWSopen sqlLK_CONN

  以上建立對表的訪問

  下面顯示內容為表達簡單沒有格式引號中為字段名

  =RS_NEWS(Extract)

  =RS_NEWS(Pic)

  這一段代碼沒有問題實現了平滑過渡;但是有個別地方有寫入操作數據不能正常讀出該段代碼如下

  dim RS_COUNT

  set RS_COUNT = servercreateobject(adodbrecordset)

  RS_COUNTopen SELECT * FROM countLK_CONN

  訪問計數器

  dim Zcount

  Zcount=RS_COUNT(Count)

  Zcount = Zcount +

  RS_COUNT(Count)Value=Zcount

  RS_COUNTUpdate

  RS_COUNTClose

  開始懷疑這一段後面有寫入操作所以不能正確執行但經過仔細比較和測試發現問題不在是否寫入上這一段的代碼主要是用了ASP訪問Access數據庫時直接填入數據庫名的方法而沒有使用SQL語句我們把打開數據庫的地方改為select * from 表名程序遂工作正常

  結論編程時應該盡量使用通用性好的方法這樣對於系統的通用性可移植性來說還是很重要的

  四ODBC的問題

  在C++Builder中有的地方要用到SQL查詢因此有一段程序使用的是ADOQuery控件本來這種用法在其他機器上用過沒有問題可是在這裡卻不行具體情況如下放置一個ADOQueryConnectionString屬性TableName屬性和前面的ADOTable屬性設置一樣Active屬性保持false再添加一個DataSource控件和幾個DBText控件設置同前然後在FormCreate(表單構造函數)中添加如下代碼

  ADOQuery>Active=false;

  ADOQuery>SQL>Clear();

  ADOQuery>SQL>Add(select * from Names order by ID);

  ADOQuery>Active=true;

  while (!ADOQuery>Eof)

  {

    ComboBox>Items>Add(ADOQuery>FieldByName(Name)>AsString);

    ADOQuery>Next();

  }

  //後一段

  ADOQuery>Active=false;

  ADOQuery>SQL>Clear();

  ADOQuery>SQL>Add(select * from Dutys order by ID);

  ADOQuery>Active=true;

  while (!ADOQuery>Eof)

  {

    ComboBox>Items>Add(ADOQuery>FieldByName(Duty)>AsString);

    ADOQuery>Next();

  }

  就這麼一段代碼在該機器上怎麼都不能運行系統總是提示BOF或EOF中有一個為真的錯誤將注釋後面的一段刪掉系統可以運行但退出程序時出現非法錯誤說明是帶故障運行反復查看找不出程序的明顯錯誤把程序拿到其他機器上可以通過兩個機器的最主要差別就是ODBC的版本不同

  於是想將ODBC降為英文版找到MDAC版安裝了幾次都不行只好手工刪除了在WINDOWS目錄中搜索出所有前綴為ODBC的文件然後刪除program files\common files中的system目錄再重新安裝MDAC(Microsoft Data Access Component 英文版)再運行該程序一切正常

  五結論

  不知道是MDAC版本的問題還是因為它是中文版的問題總之造成系統的兼容性不是很好建議大家在編程時也應該盡量使用已經熟悉的環境而不要總是去嘗試太新的東東

  當然如果是我這一段代碼有問題還希望有高手能出來指導

  以上是我們在一次數據庫系統的移植開發過程中出現問題和解決方法的真實記錄雖然問題都很小但是讓我們在開發過程中走了不少彎路所以把它記錄下來供大家參考希望對朋友們的開發有所幫助其中的問題也希望有朋友能夠指出更好的解決辦法


From:http://tw.wingwit.com/Article/program/SQL/201311/16239.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.