全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1558
推到 Plurk!
推到 Facebook!

test

 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-15 23:44:23 IP:218.16.xxx.xxx 未訂閱
測試長內容及格式,正文明天返檢後將會登在數據庫區    Delphi + MySQL 的問題探討    

前言

筆者用 Delphi 己經很久了,但由於不是全職 Programmer ,所以功力仍然很淺,慚愧。是次因為花了很多時間在 Delphi 與 MySQL 的應用上而發現很多難題,既看見不少同病相連的同道,便整理了一下所得的資料,給其他有需要的人作為參考之用。若這些資料有甚麼錯漏的地方敬請指正。 本文會以探討以 dbExpress 連結 MySQL 為主,但文未亦會提及另類的連結方法。 dbExpree 是 Borland 公司力薦的新一代跨數據庫跨平台的數據庫驅動程式架構,亦受到國內名 Delphi 作家李維先先的推薦。在設計上,該驅動程式架構的確是相當優異的。 MySQL 是最流行的發放源程式數據庫軟件,雖然它還欠缺很多大型商用數據庫的功能(像 PostQreSQL 功能就強得多),但由於它的開發商非當著重它的速度和穩定性,所以普遍流行於網上使用,亦在商用市場中功能要求較低但要求高速高穩定的範疇內佔越來越重要的地位。而且缺少的功能都在陸續加入中,若開發商能保持既有的速度和穩定優勢,有可能更進一步佔有更多的市場比率。 Delphi 6推出的第一個版本的dbexpress驅動程式架構未支援 MS SQL Server 己支援 MySQL 來看,這個Delphi 加 MySQL 的組合,是很有希望成為一個很合的組合的,可惜的是,在實作上,Borland 公司太過於建基於 interbase (Borland 自家產品) 作編程的藍圖,即使在開發別家數據庫的個別驅動程式時,亦常先入為主地以interbase 的方法來運作,至使產生很多不符合效率,甚至不能運作的情況。這個情況在 MySQL 的驅動程式尤其嚴重。面對這些問題,Borland 及其資助的 Team B 成員經常的第一反應是──這是MySQL本身的限制,所以不能符合這些那些功能,或導致這些那些臭蟲。但實際情況是,MySQL只是以不同(更快速直接但較少變化)的方式去達到同一目的,只是 Borland 不想花時間去適應個別數據庫的運作方法,而省時地使用了Interbase的運作模式罷了。最近 core Lab 推出的 MySQL 驅動程式,就完全解決了近來所知的 Borland MySQL 驅動程式的所有問題,還了MySQL一個清白。(注意,這不是推薦該驅動程式,因它可能有它的問題) 最可恨的是,Borland公司自推出該驅動程式以來既不用心的修正錯誤,也不開放源程式碼讓使用者自行修正,至使無數的使用者在遇到太多不能解決的問題後均放棄了Delphi MySQL這個組合,而2年後的新使用者還是滿懷希望而來,遇到眾多不能解決的問題而浪費不少時間,最後大多失望而回。 近一個月來,在 Borland 新聞群組裡對此的反對與要求聲音大增(筆者也是其中一個攪事份子,呵呵),亦引起不少的迴響,但未知能否加快Borland解決此問題的步伐。

版本

  • Delphi Delphi 支援 dbExpress 的有 Delphi 6 和 Delphi 7,由於使用與支授上沒甚麼分別所以不會分開探討。Delphi 3,4,5 不能通過 dbExpress 連上 MySQL,但可通過BDE ODBC MyODBC 或 Zeos 或 DirectSQL 或 ADO (Delphi 5) 連上,詳見另類連接方法
  • dbExpress Driver 現在通行的有三個版本:
    1. dbexpmys.dll Delphi 6 及 SP1 預設的版本,支援 MySQL 3.22.x,己過時,勿用。
    2. dbexpmysql.dll Delphi 6 SP2 及 Delphi 7 預設的版本,支援 MySQL 3.23.x ,為現時最通行的版本。
    3. dbexpmy4.dll 可在 下載預算支援 MySQL 4.0.x的版本,但發表後一直沒更新,極多問題(見下 MySQL 4 獨有問題),勿用。
  • MySQL 現在通行的主要有:
    1. MySQL 3.23.x (執筆時最新是3.23.55) 隱定版,大多數己開發系統正在使用的版本
    2. MySQL 4.0.x (執筆時最新是4.0.11a) 最後測試版,應很快轉為隱定版,開發商鼓勵新開發的軟件使用這個版本,有不少增強了的功能。
    3. MySQL 4.1.X (執筆時4.1.0可供下載源程式,安裝檔並未提供) 最新版本,有更多新增功能,最重要的是 SubQuery,由於最新版不隱定,短時間內不鼓勵使用
  • Libmysql.dll 這個是外界連接 MySQL 的介面驅動程式,所有版本的 dbExpress 驅動程式都經這個 dll 連上 MySQL 。基本上,每個版本的 MySQL 均有相對的 libmysql.dll。但是,由於不同版本的 libmysql.dll 的預設介面有時有一點改變,所以經常發生 libmysql.dll 與 dbexpress 驅動程式不相容的情況。簡單來說 dbexpmys.dll 要配 3.22.x 的libmysql.dll, dbexpmysql.dll 要配 3.23.x 的 dll, 而 dbexpmy4.dll 只能配 4.0.1 的 libmysql.dll (見下 MySQL 4 獨有問題)。

Borland Quality Central (品質中心)

由於下面會多次提到品質中文的文件,所以先介紹這個供使用者提議和報告臭蟲的地方。 品質中心是半官方的機制,不是由 Borland 員工直接主持而是與 Borland 有密切關係的自願人仕主持(筆:賣這麼貴連這個錢也省,唉)。在那裡發表的要求與報告,不會直接進到 Borland 的內部資料庫,而是經那些自願的系統操作員看過,測試過認為有需要才將報告傳送到 Borland 的內部資料庫處理。雖然這樣做比較轉折,但總比以前沒有機制將聲音傳到 Borland 內部好。 由於報告眾多,那些報告比較重要,那些報告較多人關註,而需要先處理的呢?品質中心提供2個機缺去決給系統管理員們參考。 第一個是投票,每個使用者只有5票,你可投在你認為最重要的一或數個報告中,多票數的自然比較優先的了。 第二個是評分,每個使用者都可為每份報告評分,優質的報告也偏向放得到較快的處理。 多一些使用者參與其中,不但能使資源用在更多人關註的地方,更給 Borland 更大的壓力說明我們使用者是注重我們的權利的。

參與品質中心

所有註冊使用者均可參與品質中心,即是不是註冊使用者好像也可以使用(這個我不大肯定,因我使用時己註冊了)。方法如下 :
  1. 在 http://bdn.borland.com 申請一個戶口 (任何人也可申請,不限註冊用者)
  2. 在 http://qc.borland.com/wc/wc.exe/ 登入網頁介面 或 到 http://qc.borland.com 下載Window客戶端程式。由於現時網頁介面在發中,所以功能較少和較慢。
  3. 使用你在 bdn 申請的戶口便可進人。
  4. 你可以以不同種類來溜覽,針對報告作投票(vote),評分(rate) 或提出意見(Comment)

DBExpress 官方 Driver 的問題

MySQL 4 獨有的問題

若你使用的是 MySQL 4.0.x 的版本,你會發現你根本連不上 MySQL Server。原因是你的 dbExpress 驅動程式與你的 LibMySQL.dll 版本不附。 上文以有提及,Delphi 6/7 提供的驅動程式是針對於 MySQL 3.X 的,所以與 MySQL 4.0.x 不相附。Borland 在 2002年三月時登出了 MySQL 4.0.1 的驅動程式測試版。該驅動程式並沒加上4.0.x的新增功能,只是調整介面以配合4.0.1版的 Libmysql.dll。更可惜的是,該驅動程式測試版充滿臭蟲而且在較新版的 Libmysql.dll 中再次失效。 早前在網上有一個暫時解決方案,就是不用最新的 libmysql.dll,而繼續使用 4.0.1 的 libmysql.dll 來配合較新版的 MySQL Server。這方案在 4.0.9及以前的版本時確是可行的,但使用在 MySQL Server 4.0.10之後的版本亦告失敗了。由於這個driver沒新增工能且臭蟲多多,即使你是使用4.0.9之前的版本,亦不建議使用這個驅動程式。 [dbexpmy4.dll 下載 : http://bdn.borland.com/article/0,1410,28590,00.html] 若你不想使用別家的驅動程式,現在唯一的暫時解決方案是使用 dbexpmysql.dll 配 3.23.55 (或稍早版本) 的 libmysql.dll。當然,有些MySQL4的新增工能會因此而運用不到,但大多3.23.x版本的功能還是可如常操作的,總比不能連上主機好多了。 另外的解決辦法是使用第三者提供的驅動程式,本文稍後將會稍作介紹 Core Lab 的收費驅動程式,和免費的 Open ODBC 驅動程式。最後,使用者也可選擇跳過 dbExpress 而用其他另類的連接方法,亦將於稍後討論。 你的幫助: 你可到品質中心投票評分,以加強要求更新驅動程式的聲音。 http://qc.borland.com/wc/wc.exe/details?reportid=3731 http://qc.borland.com/wc/wc.exe/details?reportid=3732

所有版本共同問題

以下問題大部份是 MySQL 驅動程式獨有的問題,有些是一般dbExpress都會遇到的問題的問題。由於問題的詳情和複制該問題的步驟均已在QC裡有詳細說明,所以我只會簡介並列出相關的QC連結。若不你對某問題看不明白或不能申請QC戶口可提出,我會試試抽時間解釋詳細一些。若你發理更多的難題或你有解決方案而不想自行打在QC中,可post在這裡,我也會抽時間打進 QC 裡。
  1. 不必要的長時間 Read Lock (http://qc.borland.com/wc/wc.exe/details?reportid=3814) 若使用 TQuery / TSQLDataSet 去讀取一些較大的 Tables,dbExpress 會鎖定那些 Tables 直至移動到近尾段或關閉才解開鎖。鎖著期間所有使用者不能 insert / update / delete 那些 Tables。若某程序用這兩個組件開啟資料集後停住,或一個一個記錄慢慢的處理,就會有一大段時間所有人都不能更新那些Table,而且畫面被凍結。
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC, Zeos 均沒有這個問題。
    • 解決辦法:即使用不到亦加入TClientDataSet (或直接使用 TSimpleDataSet) 非設定 PacketRecord 為 -1 另 dbexpress 一次過讀入所有資料並解鎖。會浪費不必要的資源,但總比所有人不能更新好。
  2. 多層架構不能使用 Transaction (http://qc.borland.com/wc/wc.exe/details?reportid=1074) 在多層架構(使用DataSnap)裡,若你使用Transaction去控制一個批次的更新,在任何一個Table發生錯誤時自動Roll Back,將不能成功RollBack。因為 dbExpress 會將每句SQL分成不同的 connection 去連接 mySQL,但 MySQL 不支援以不同的連接做同一個 Tranaction 的,所以Update了的將不能RollBack。
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos不支援DataSnap
    • 解決辦法:無
  3. 多層架構不能回傳 Last_Insert_ID (http://qc.borland.com/wc/wc.exe/details?reportid=1074) Master-Detail Table 很常以數據庫自動產生的 ID 欄位來連結,在 MySQL 可用 Last_Insert_ID來取得 新增 Master 記錄的 ID 以便儲存到 Detail 資料裡。但由於 dbExpress 會將每句SQL分成不同的 connection 去連接 mySQL ,所以亦不能成功取回剛 insert 的 ID 了
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos不支援DataSnap
    • 解決辦法:無有穩妥的方式,可以 Max(ID)來代替但不一定可靠
  4. Table名及欄位名稱不能使用保留字 (http://qc.borland.com/wc/wc.exe/details?reportid=3782) MySQL 是支援以保留字作 Table 或欄位名稱的,你只要在 SQL 裡用 ' 括住該欄位就可以了。所以一般自動組成的 SQL 都會括住所有欄位以防萬一。但 dbExpress 沒這裡做所以若有某個 Table 或欄位名稱是保留字則會發生錯誤
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos 6.0.4 有一樣的問題,5.4.1好像沒這個問題但我反安裝了不能測試
    • 解決辦法:只好改掉所有保留字的欄位名稱
  5. Show create Table 最多只回傳1024字 (http://qc.borland.com/wc/wc.exe/details?reportid=1810) 有時需要用 show create table 來回傳 create 某 Table 的語法來造暫存檔,但若回傳文字大於1024位元尾段會被切去。
    • 其他連接方法: Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos 均沒這個問題,Core Lib 只回傳了 Table 名,未知甚麼原因 (我用的是試用版)
    • 解決辦法:只好改掉所有保留字的欄位名稱
  6. 不能設定 MySQL Server 的 Port (http://qc.borland.com/wc/wc.exe/details?reportid=3731) 這是所有dbExpress Driver的共同問題,數據庫主機只能設定在預設的 Port
    • 其他連接方法: Core Lib 同樣有這個問題,Open ODBC 及 BDE ODBC 可透過 Connect String 設定, Zeos 可直接設定
    • 解決法方: Server 只好只用需設 Port
  7. Order by 與 Limit 同用會出錯 (Only, http://qc.borland.com/wc/wc.exe/details?reportid=3740) Kylix 有這問題,Delphi 好像沒有這個問題。
  8. 當 Order by 與 Limit 同用時,dbExpress會把 Limit 數字 n 當為以第 n 欄索引

第三者dbExpress驅動程式簡介

Open ODBC for dbexpress

http://sourceforge.net/projects/open-dbexpress 這是一個免費的 dbExpress ODBC Driver,基本上支援所有ODBC能連接的數據庫。 好處:
  • 上列有問題都不存在
  • 免費
  • 由於同樣使用 dbexpress 技術,若 Borland 有好的新驅動程式直接轉過去即可
  • 同一個 Driver 可支援不同的數據庫。
壞處:
  • 多了一重ODBC,理論上會變慢
  • 功能受ODBC限制
  • 需要在 www.mysql.com 下載並安裝 myodbc 並在 odbc 建立資料庫連接
  • 最新版只在cvs裡提供,要使用cvs client 下載,首次使用比較煩,但以後很方便,按一下便可更新。

Core Lib MySQL Driver

http://crlab.com/dbx/ 這是一個要付費的 MySQL dbExpress Driver,支授 3.23.x 及 4.0.x 版本的 MySQL 。 好處:
  • 上列的問題大多不存在
  • 直接支援 MySQL 的多個版本,速度應較快而兼容度應較高
  • 由於同樣使用 dbexpress 技術,若 Borland 有好的新驅動程式直接轉過去即可
壞處:
  • 要付費標準 US$69 連源程式 US$149
  • 暫時發理 show create table 不能得出正確結果,已電郵給 CR Lab,不知他們會否回郵及處理

非 dbExpress 的連結

這些連結方法通常適用於 D3 - D7,但即使Borland推出好的 dbExpress 驅動程式,亦不容易轉成 dbExpress 架構。

BDE ODBC

傳統的連結方法,其本上可連上所有ODBC支援的數據庫,且支援DataSnap / MIDAS 分散式多層架構。 好處:
  • 上列問題均不存在
  • 運作多年,很多人在這方面都有不少經驗,相關書本亦多
  • 支授不同的數據庫與多層架構
壞處:
  • 中間一層接一層,影響功能與效能
  • BDE 與 ODBC 均開始過時,BOrland 亦己停止開發 BDE 了
  • BDE 與 ODBc 安裝均比較煩

Zeos 5.4.1

http://sourceforge.net/projects/zeoslib 免費的BDE替代組件,直接存取多種數據庫,各數據庫有獨立組件。 好處:
  • 快,由其是費時處理的和資料量大的,可以比BDE快好幾倍!
  • 不用安裝煩人的BDE / ODBC
  • 支援某些數據庫的其中一些獨有功能
壞處:
  • 處理單一簡單的 sql 時(如insert一個記錄)比 BDE 慢幾倍,因它過份嚴緊地檢查每一句SQL,我用時自行改寫成不同程度的檢查,簡單句式明顯加快,甚至比 BDE 還快一點
  • 開發者不再改進與支援這個版本 (Zeos 6.X 是完全重新開發)
  • 不支援 DataSnap / MIDAS,我用時加強了支援MIDAS Select部份,因它的 Select 超快,所以用它來做唯讀資料,用 BDE 做 Update
  • 要轉換數據庫程式很難,因每種數據庫都有自己一套元件

Zeos 6.0.4

http://sourceforge.net/projects/zeoslib 新一代的 Zeos,完全重新建購撰寫,和 dbExpress 類似一組元件共於多種數量庫,在 Connection 元件輸入使用那種制式(potocal)即可。 好處:
  • 快逮直接的存取資料(我還沒時間測試它與dbExpress的速度比)
  • 不用安裝煩人的 BDE / ODBC
  • 支援 MIDAS / DataSnap 的 select 部份
壞處:
  • 剛開發,還有許多問題和不易使用(例:如你使用mysql制式要手動加入 use ZdbcMySQL,否則就說沒有驅動程式)
  • 不支援 MIDAS / DataSnap insert / update / delete 部份,不知以後會否支援
〔h3]DirectSQL[/h3] http://sourceforge.net/projects/directsql 這是一個免費又神奇的東西,讓你的程式不需要任何附加檔案(其他的全都需要 libmysql.dll) 便直接與 MySQL Server 對話,比 Zeos 更快。 由於這只是一個功能庫而沒有自己的視覺化組件,亦沒有DataSet給你連接資料感知元件,使用上非常類似直接以PHP存取 MySQL 。雖然如此,但作者亦提供一個方法將 Zeos 5.4.1 和 DirectSQL 合併,使 Zeos 5.4.1 的視覺他組件及 DataSet 可以跳過 Libmysql.dll 而直接以 DirectSQL 的功能存取 MySQL Server ! 好處:
  • 合併後比 Zeos 5.4.1 更快一點
  • 客戶端完全不需任何dll,免去 libmysql.dll 不同版本的困擾
  • 自己可改動所有源程式以配合你自己的需要
  • 承繼其他 Zeos 5.4.1的優點
壞處:
  • 要合併Zeos有點難,要手動做點工夫(網站有教)
  • 承繼其他 Zeos 5.4.1的壞處[/*]
其他連結 最早期的 MySQL dbExpress driver 源程式,臭蟲多多,沒甚麼實用但可供參考。 http://bdn.borland.com/article/0,1410,27918,00.html Borland 新聞群組 news://newsgroups.borland.com (News Client) http://newsgroups.borland.com (Web) 筆者的網站 (Macromedia Flash 的外掛程式,用Delphi KOL寫的,完全沒打廣告,靠使用者介紹,才賣了約100套,失敗) www.lpflashex.com
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-16 12:54:15 IP:218.16.xxx.xxx 未訂閱
再試一次    Delphi + MySQL 的問題探討    

前言

筆者用 Delphi 己經很久了,但由於不是全職 Programmer ,所以功力仍然很淺,慚愧。是次因為花了很多時間在 Delphi 與 MySQL 的應用上而發現很多難題,既看見不少同病相連的同道,便整理了一下所得的資料,給其他有需要的人作為參考之用。若這些資料有甚麼錯漏的地方敬請指正。 本文會以探討以 dbExpress 連結 MySQL 為主,但文未亦會提及另類的連結方法。 dbExpree 是 Borland 公司力薦的新一代跨數據庫跨平台的數據庫驅動程式架構,亦受到國內名 Delphi 作家李維先先的推薦。在設計上,該驅動程式架構的確是相當優異的。 MySQL 是最流行的發放源程式數據庫軟件,雖然它還欠缺很多大型商用數據庫的功能(像 PostQreSQL 功能就強得多),但由於它的開發商非當著重它的速度和穩定性,所以普遍流行於網上使用,亦在商用市場中功能要求較低但要求高速高穩定的範疇內佔越來越重要的地位。由於缺少的功能都在陸續加入中,若開發商能保持既有的速度和穩定優勢,有可能更進一步佔有更多的市場比率。 從Delphi 6推出的第一個版本的dbexpress驅動程式架構未支援 MS SQL Server 己支援 MySQL 來看,這個Delphi 加 MySQL 的組合,是很有希望成為一個很好的組合的,可惜的是,在實作上,Borland 公司太過於建基於 interbase (Borland 自家產品) 作編程的藍圖,即使在開發別家數據庫的個別驅動程式時,亦常先入為主地以interbase 的方法來運作,至使產生很多不符合效率,甚至不能運作的情況。這個情況在 MySQL 的驅動程式尤其嚴重。面對這些問題,Borland 及其資助的 Team B 成員經常的第一反應是──這是MySQL本身的限制,所以不能符合這些那些功能,或導致這些那些臭蟲。但實際情況是,MySQL只是以不同(更快速直接但較少變化)的方式去達到同一目的,只是 Borland 不想花時間去適應個別數據庫的運作方法,而省時地使用了Interbase的運作模式罷了。最近 core Lab 推出的 MySQL 驅動程式,就完全解決了近來所知的 Borland MySQL 驅動程式的絕大部份問題,還了MySQL一個清白。(注意,這不是推薦該驅動程式,因它可能也有它的問題) 最可恨的是,Borland公司自推出該驅動程式以來既不用心的修正錯誤,也不開放源程式碼讓使用者自行修正,至使無數的使用者在遇到太多不能解決的問題後均放棄了Delphi MySQL這個組合,而2年後的今天,新使用者還是滿懷希望而來,遇到眾多不能解決的問題而浪費不少時間,最後大多失望而回。 近一個月來,在 Borland 新聞群組裡對此的投訴與要求聲音大增(筆者也是其中一個攪事份子,呵呵),亦引起不少的迴響,但未知能否加快Borland解決此問題的步伐。

版本

  • Delphi Delphi 支援 dbExpress 的有 Delphi 6 和 Delphi 7,由於使用與支援上沒甚麼分別所以不會分開探討。Delphi 3,4,5 不能通過 dbExpress 連上 MySQL,但可通過BDE ODBC MyODBC 或 Zeos 或 DirectSQL 或 ADO (Delphi 5) 連上,詳見另類連接方法。
  • dbExpress Driver 現在通行的有三個版本:
    1. dbexpmys.dll Delphi 6 及 SP1 預設的版本,支援 MySQL 3.22.x,己過時,勿用。
    2. dbexpmysql.dll Delphi 6 SP2 及 Delphi 7 預設的版本,支援 MySQL 3.23.x ,為現時最通行的版本。
    3. dbexpmy4.dll 預算支援 MySQL 4.0.x的版本,但2002年4月後發表後一直沒更新,極多問題(見下 MySQL 4 獨有問題),勿用。
  • MySQL 現在通行的主要有:
    1. MySQL 3.23.x (執筆時最新是3.23.55) 隱定版,大多數己開發系統正在使用的版本
    2. MySQL 4.0.x (執筆時最新是4.0.11a) 最後測試版,應很快轉為隱定版,開發商鼓勵新開發的軟件使用這個版本,有不少增強了的功能。
    3. MySQL 4.1.X (執筆時4.1.0可供下載源程式,安裝檔並未提供) 最新版本,有更多新增功能,最重要的是 SubQuery,由於最新版不隱定,短時間內不鼓勵使用
  • Libmysql.dll 這個是外界連接 MySQL 的介面驅動程式,所有版本的 dbExpress 驅動程式都經這個 dll 連上 MySQL 。基本上,每個版本的 MySQL 均有相對的 libmysql.dll。但是,由於不同版本的 libmysql.dll 的預設介面有時有一點改變,所以經常發生 libmysql.dll 與 dbexpress 驅動程式不相容的情況。簡單來說 dbexpmys.dll 要配 3.22.x 的libmysql.dll, dbexpmysql.dll 要配 3.23.x 的 dll, 而 dbexpmy4.dll 只能配 4.0.1 的 libmysql.dll (見下 MySQL 4 獨有問題)。

Borland Quality Central (品質中心)

由於下面會多次提到品質中文的文件,所以先介紹這個供使用者提議和報告臭蟲的地方。 品質中心是半官方的機制,不是由 Borland 員工直接主持而是與 Borland 有密切關係的自願人仕主持(筆:賣這麼貴連這個錢也省,唉)。在那裡發表的要求與報告,不會直接進到 Borland 的內部資料庫,而是經那些自願的系統操作員看過,測試過認為有需要才將報告傳送到 Borland 的內部資料庫處理。雖然這樣做比較轉折,但總比以前沒有機制將聲音傳到 Borland 內部好。 由於報告眾多,那些報告比較重要,那些報告較多人關註,而需要先處理的呢?品質中心提供2個機制去給系統管理員們參考。 第一個是投票,每個使用者只限5票,你可投在你認為最重要的一或數個報告中,多票數的自然比較優先的了。 第二個是評分,每個使用者都可為每份報告評分,優質的報告也偏向於得到較快的處理。 多一些使用者參與其中,不但能使資源用在更多人關註的地方,更給 Borland 更大的壓力說明我們使用者是注重我們的權利的。

參與品質中心

所有註冊使用者均可參與品質中心,即是不是註冊使用者好像也可以使用(這個我不大肯定,因我使用時己註冊了)。方法如下 :
  1. 在 http://bdn.borland.com 申請一個戶口 (任何人也可申請,不限註冊用者)
  2. 在 http://qc.borland.com/wc/wc.exe/ 登入網頁介面 或 到 http://qc.borland.com 下載Window客戶端程式。由於現時網頁介面在發中,所以功能較少和較慢。
  3. 使用你在 bdn 申請的戶口便可進人。
  4. 你可以以不同種類來溜覽,針對報告作投票(vote),評分(rate) 或提出意見(Comment)

DBExpress 官方 Driver 的問題

MySQL 4 獨有的問題

若你使用的是 MySQL 4.0.x 的版本,你會發現你根本連不上 MySQL Server。原因是你的 dbExpress 驅動程式與你的 LibMySQL.dll 版本不苻。 上文已有提及,Delphi 6/7 提供的驅動程式是針對於 MySQL 3.X 的,所以與 MySQL 4.0.x 不相符。Borland 在 2002年三月時登出了 MySQL 4.0.1 的驅動程式測試版。該驅動程式並沒加上4.0.x的新增功能,只是調整介面以配合4.0.1版的 Libmysql.dll。更可惜的是,該驅動程式測試版充滿臭蟲而且在較新版的 Libmysql.dll 中再次失效。 [dbexpmy4.dll 下載 : http://bdn.borland.com/article/0,1410,28590,00.html] 早前在網上有一個暫時解決方案,就是不用最新的 libmysql.dll,而繼續使用 4.0.1 的 libmysql.dll 來配合較新版的 MySQL Server。這方案在 4.0.9及以前的版本時確是可行的,但是在 MySQL Server 4.0.10之後的版本亦告失敗了。由於這個driver沒新增工能且臭蟲多多,即使你是使用4.0.9之前的版本,亦不建議使用這個驅動程式。 若你不想使用別家的驅動程式,現在唯一的暫時解決方案是使用 dbexpmysql.dll 配 3.23.55 (或稍早版本) 的 libmysql.dll。當然,有些MySQL4的新增工能會因此而運用不到,但大多3.23.x版本的功能還是可如常操作的,總比不能連上主機好多了。 另外的解決辦法是使用第三者提供的驅動程式,本文稍後將會稍作介紹 Core Lab 的收費驅動程式,和免費的 Open ODBC 驅動程式。最後,使用者也可選擇跳過 dbExpress 而用其他另類的連接方法,亦將於稍後討論。 你的幫助: 你可到品質中心投票評分,以加強要求更新驅動程式的聲音。 http://qc.borland.com/wc/wc.exe/details?reportid=3731 http://qc.borland.com/wc/wc.exe/details?reportid=3732

所有版本共同問題

以下問題大部份是 MySQL 驅動程式獨有的問題,但有些也是一般 dbExpress 會遇到的問題。由於問題的詳情和複制該問題的步驟均已在QC裡有詳細說明,所以我只會簡介並列出相關的QC連結。若你對某問題看不明白或不能申請QC戶口可提出,我會試試抽時間解釋詳細一些。若你發理更多的難題或你有解決方案而不想自行打在QC中,可post在這裡,我也會抽時間打進 QC 裡。
  1. 不必要的長時間 Read Lock (http://qc.borland.com/wc/wc.exe/details?reportid=3814) 若使用 TQuery / TSQLDataSet 去讀取一些較大的 Tables,dbExpress 會鎖定那些 Tables 直至移動到近尾段或關閉才解開鎖。鎖著期間所有使用者不能 insert / update / delete 那些 Tables。若某程序用這兩個組件開啟資料集後停住,或一個一個記錄慢慢的處理,就會有一大段時間所有人都不能更新那些Table,而且畫面被凍結。
    • 解決辦法:即使用不到亦加入TClientDataSet (或直接使用 TSimpleDataSet) 並設定 PacketRecord 為 -1 令 dbexpress 一次過讀入所有資料並解鎖。這樣做可能會浪費不必要的資源,但總比所有人不能更新好。
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC, Zeos 均沒有這個問題。
  2. 多層架構不能使用 Transaction (http://qc.borland.com/wc/wc.exe/details?reportid=1074) 在多層架構(使用DataSnap)裡,若你使用Transaction去控制一個批次的更新,在任何一個Table發生錯誤時自動Roll Back,將不能成功RollBack。因為 dbExpress 會將每句SQL分成不同的 connection 去連接 mySQL,但 MySQL 不支援以不同的連接做同一個 Tranaction 的,所以Update了的將不能RollBack。
    • 解決辦法:沒有
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos不支援DataSnap Update
  3. 多層架構不能回傳 Last_Insert_ID (http://qc.borland.com/wc/wc.exe/details?reportid=1074) Master-Detail Table 很常以數據庫自動產生的 ID 欄位來連結,在 MySQL 可用 Last_Insert_ID來取得 新增 Master 記錄的 ID 以便儲存到 Detail 資料裡。但由於 dbExpress 會將每句SQL分成不同的 connection 去連接 mySQL ,所以亦不能成功取回剛 insert 的 ID 了
    • 解決辦法:沒有有穩妥的方式,可以用 Max(ID) 來代替但不一定可靠
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos不支援DataSnap Update
  4. Table名及欄位名稱不能使用保留字 (http://qc.borland.com/wc/wc.exe/details?reportid=3782) MySQL 是支援以保留字作 Table 或欄位名稱的,你只要在 SQL 裡用 '' 括住該欄位就可以了。所以一般自動組成的 SQL 都會括住所有欄位以防萬一。但 dbExpress 沒這樣做所以若有某個 Table 或欄位名稱是保留字則會發生錯誤
    • 解決辦法:只好改掉所有保留字的欄位名稱
    • 其他連接方法:Core Lib, Open ODBC for dbexpress, BDE ODBC 均沒這個問題,Zeos 6.0.4 有一樣的問題,5.4.1好像沒這個問題但我反安裝了不能測試
  5. Show create Table 最多只回傳1024字 (http://qc.borland.com/wc/wc.exe/details?reportid=1810) 有時需要用 show create table 來回傳 create 某 Table 的語法來造暫存檔,但若回傳文字大於1024位元尾段會被切去。
    • 解決辦法:只好改掉所有保留字的欄位名稱
    • 其他連接方法: Open ODBC for dbexpress, BDE ODBC, Zeos 均沒這個問題,Core Lib 只回傳了 Table 名,未知甚麼原因 (我用的是試用版)
  6. 不能設定 MySQL Server 的 Port (http://qc.borland.com/wc/wc.exe/details?reportid=3731) 這是所有dbExpress Driver的共同問題,數據庫主機只能設定在預設的 Port
    • 解決法方: Server 只好使用預設 Port
    • 其他連接方法: Core Lib 同樣有這個問題,Open ODBC 及 BDE ODBC 可透過 Connect String 設定, Zeos 可直接設定
  7. Order by 與 Limit 同用會出錯 (Only, http://qc.borland.com/wc/wc.exe/details?reportid=3740) Kylix 有這問題,Delphi 好像沒有這個問題。
  8. 當 Order by 與 Limit 同用時,dbExpress會把 Limit 數字 n 當為以第 n 欄索引

第三者dbExpress驅動程式簡介

Open ODBC for dbexpress

http://sourceforge.net/projects/open-dbexpress 這是一個免費的 dbExpress ODBC Driver,基本上支援所有ODBC能連接的數據庫。 好處:
  • 上列的問題都不存在
  • 免費
  • 由於同樣使用 dbexpress 技術,若 Borland 有好的新驅動程式直接轉過去即可
  • 同一個 Driver 可支援不同的數據庫。
壞處:
  • 多了一重ODBC,理論上會變慢
  • 功能受ODBC限制
  • 需要在 www.mysql.com 下載並安裝 MyODBC 並在 ODBC 建立資料庫連接
  • 最新版只在cvs裡提供,要使用cvs client 下載,首次使用比較煩。 (但以後很方便,按一下便可更新)

Core Lib MySQL Driver

http://crlab.com/dbx/ 這是一個要付費的 MySQL dbExpress Driver,支授 3.23.x 及 4.0.x 版本的 MySQL 。 好處:
  • 上列的問題大多不存在
  • 直接支援 MySQL 的多個版本,速度應較快而兼容度應較高
  • 由於同樣使用 dbexpress 技術,若 Borland 有好的新驅動程式直接轉過去即可
壞處:
  • 要付費標準 US$69 連源程式 US$149
  • 暫時發現 show create table 不能得出正確結果,已電郵給 Core Lab,不知他們會否回郵及處理

非 dbExpress 的連結

這些連結方法通常適用於 D3 - D7,但即使 Borland 推出良好的 dbExpress 驅動程式,亦不容易轉成 dbExpress 架構。

BDE ODBC

傳統的連結方法,基本上可連上所有ODBC支援的數據庫,且支援DataSnap / MIDAS 分散式多層架構。 好處:
  • 上列問題均不存在
  • 運作多年,很多人在這方面都有不少經驗,相關書本亦多
  • 支授不同的數據庫與多層架構
壞處:
  • 中間一層接一層,影響功能與效能
  • BDE 與 ODBC 均開始過時,Borland 亦己停止開發 BDE 了
  • BDE 與 ODBC 安裝均比較煩

Zeos 5.4.1

http://sourceforge.net/projects/zeoslib 免費的BDE替代組件,直接存取多種數據庫,各數據庫有獨立組件。 好處:
  • 快,由其是費時處理的和資料量大的,可以比BDE快好幾倍!
  • 不用安裝煩人的BDE / ODBC
  • 支援某些數據庫的其中一些獨有功能
壞處:
  • 處理單一簡單的 sql 時(如insert一個記錄)比 BDE 慢幾倍,因它過份嚴緊地檢查每一句SQL。我用時自行改寫成不同程度的檢查,簡單句式明顯加快,甚至比 BDE 還快一點
  • 開發者不再改進與支援這個版本 (Zeos 6.X 是完全重新開發)
  • 不支援 DataSnap / MIDAS,我用時加強了支援MIDAS Select部份,因它的 Select 超快,所以用它來做唯讀資料,用 BDE 做 Update
  • 要轉換數據庫程式很難,因每種數據庫都有自己一套元件

Zeos 6.0.4

http://sourceforge.net/projects/zeoslib 新一代的 Zeos,完全重新建購撰寫,和 dbExpress 類似一組元件共於多種數量庫,在 Connection 元件輸入使用那種制式(potocol)即可。 好處:
  • 快逮直接的存取資料(我還沒時間測試它與dbExpress的速度比)
  • 不用安裝煩人的 BDE / ODBC
  • 支援 MIDAS / DataSnap 的 select 部份
壞處:
  • 剛開發,還有許多問題和不易使用(例:如你使用mysql制式要手動加入 use ZdbcMySQL,否則就說沒有驅動程式)
  • 不支援 MIDAS / DataSnap insert / update / delete 部份,不知以後會否支援

DirectSQL

http://sourceforge.net/projects/directsql 這是一個免費又神奇的東西,讓你的程式不需要任何附加檔案(其他的全都需要 libmysql.dll) 便直接與 MySQL Server 對話,比 Zeos 更快。 由於這只是一個功能庫而沒有自己的視覺化組件,亦沒有DataSet給你連接資料感知元件,使用上非常類似直接以PHP存取 MySQL 。雖然如此,但作者亦提供一個方法將 Zeos 5.4.1 和 DirectSQL 合併,使 Zeos 5.4.1 的視覺他組件及 DataSet 可以跳過 Libmysql.dll 而直接以 DirectSQL 的功能存取 MySQL Server ! 好處:
  • 合併後比 Zeos 5.4.1 更快一點
  • 客戶端完全不需任何dll,免去 libmysql.dll 不同版本的困擾
  • 自己可改動所有源程式以配合你自己的需要
  • 承繼其他 Zeos 5.4.1的優點
壞處:
  • 要合併Zeos有點難,要手動做點工夫(網站有教)
  • 承繼其他 Zeos 5.4.1的壞處[/*]

ADO

我以前用 Delphi 5 時試過用 ADO MyOLEDB 連結 MySQL,和 BDE 及 Zeos 作比較,不但速度極差,而且經常出現錯誤,所以完全放棄了這個方式。

總結[h2] 雖然現在已有不少方法讓 Delphi/Kylix 和 MySQL 結合起來,但是暫時卻沒有完全另人满意的方案。最理想的當然是 Borland 儘快的推出認真更新的驅動程式,及開放該驅動程式源程式碼以便使用者自行修正錯誤,但大家也明白對大公司來說,這是不容易發生的。現在來說,若你信任 dbExpress 技術,先使用第三者 ODBC 驅動程式似乎是最好的方式,因為當 Borland 更新驅動程式時,應可輕而易舉的轉用新的驅動程式。若你不需要多層架構,Zeos系列亦不失為一個良好的途徑。 [h2]其他連結

dbExpress Plus 免費的 dbExpress 元件替代品,增加功能並條正 dbExpress 的一些錯誤 http://sourceforge.net/projects/dbexpressplus 最早期的 MySQL dbExpress driver 源程式,臭蟲多多,沒甚麼實用但可供參考。 http://bdn.borland.com/article/0,1410,27918,00.html Borland 新聞群組 news://newsgroups.borland.com (News Client) http://newsgroups.borland.com (Web) 筆者的網站 (Macromedia Flash 的外掛程式,用Delphi KOL寫的,完全沒打廣告,靠使用者介紹,才賣了約100套,失敗) http://www.lpflashex.com Peter Yau (Justmade) 2003-03-15 草稿 2003-03-16 於 Delphi K.Top 討論區發表
系統時間:2024-04-26 11:13:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!