[转贴]Delphi + MySQL 的問題探討

beatles1979 2003-10-17 02:35:05
[转贴]Delphi + MySQL 的問題探討

前言

筆者用 Delphi 己經很久了,但由於不是全職 Programmer ,所以功力仍然很淺,慚愧。是次因為花了很多時間在 Delphi 與 MySQL 的應用上而發現很多難題,既看見不少同病相連的同道,便整理了一下所得的資料,給其他有需要的人作為參考之用。若這些資料有甚麼錯漏的地方敬請指正。

本文會以探討以 dbExpress 連結 MySQL 為主,但文未亦會提及另類的連結方法。

dbExpree 是 Borland 公司力薦的新一代跨數據庫跨平台的數據庫驅動程式架構,亦受到國內名 Delphi 作家李維先先的推薦。在設計上,該驅動程式架構的確是相當優異的。

MySQL 是最流行的發放源程式數據庫軟件,雖然它還欠缺很多大型商用數據庫的功能 (如 Stored Procedure, Trigger 等),但由於它的開發商非當著重它的速度和穩定性,所以普遍流行於網上使用,亦在商用市場中功能要求較低但要求高速高穩定的範疇內佔越來越重要的地位。由於缺少的功能都在陸續加入中,若開發商能保持既有的速度和穩定優勢,有可能更進一步佔有更多的市場比率。

從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 / Kylix
Delphi 支援 dbExpress 的有 Delphi 6 和 Delphi 7,由於使用與支援上沒甚麼分別所以不會分開探討。
Delphi 3,4,5 不能通過 dbExpress 連上 MySQL,但可通過BDE + ODBC + MyODBC 或 Zeos 或 DirectSQL 或 ADO (Delphi 5) 連上,詳見另類連接方法。
Kylix 1,2,3 基本上可使用 dbExpress ,但在 DataSnap 上有較多限制,由於筆者沒使用,所以本文甚少提及。


dbExpress Driver
現在通行的有三個版本:

dbexpmys.dll
Delphi 6 及 SP1 預設的版本,支援 MySQL 3.22.x,己過時,勿用。

dbexpmysql.dll
Delphi 6 SP2 及 Delphi 7 預設的版本,支援 MySQL 3.23.x ,為現時最通行的版本。

dbexpmy4.dll
預算支援 MySQL 4.0.x的版本,但2002年4月發表後一直沒更新,極多問題(見下 MySQL 4 獨有問題),勿用。


MySQL
現在通行的主要有:

MySQL 3.23.x (執筆時最新是3.23.55)
隱定版,大多數己開發系統正在使用的版本

MySQL 4.0.x (執筆時最新是4.0.11a)
最後測試版,應很快轉為隱定版,開發商鼓勵新開發的軟件使用這個版本,有不少增強了的功能。

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 更大的壓力說明我們使用者是注重我們的權利的。


參與品質中心

所有註冊使用者均可參與品質中心,即是不是註冊使用者好像也可以使用(這個我不大肯定,因我使用時己註冊了)。方法如下 :


在 http://bdn.borland.com 申請一個戶口 (任何人也可申請,不限註冊用者)

在 http://qc.borland.com/wc/wc.exe/ 登入網頁介面 或 到 http://qc.borland.com 下載Window客戶端程式。由於現時網頁介面在發中,所以功能較少和較慢。

使用你在 bdn 申請的戶口便可進人。

你可以以不同種類來溜覽,針對報告作投票(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 裡。



不必要的長時間 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 均沒有這個問題。


多層架構不能使用 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。

解決辦法:沒有

...全文
70 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
beatles1979 2003-10-21
  • 打赏
  • 举报
回复
现在我改用Dbexpress了
感觉还行
就是怕mysql3.23.52的系统漏洞哦
呵呵
还不知道怎么才能搞定那

不管了
先作再说吧
fish21cn 2003-10-20
  • 打赏
  • 举报
回复
菜鸟ing,还不知道有这些问题。
反正只知道ODBC连接有问题。
beatles1979 2003-10-19
  • 打赏
  • 举报
回复
不是吧,我的不会也一样吧
那我就晕了!
beatles1979 2003-10-19
  • 打赏
  • 举报
回复
不过应该没关系的
我到时时候发布的时候
是用FreeBSD下面的Mysql
应该没问题吧

开发在Win32下
到时候数据库放在FreeBSD下面就可以了呀
swotcoder 2003-10-18
  • 打赏
  • 举报
回复
MySQLDAC比较新的版本是没破解的,郁闷!
swotcoder 2003-10-18
  • 打赏
  • 举报
回复
文档你可以去MySQL的网站找,DBexpress是封装操作方法看他的手册,注意MySQL特别的地方就是了。我是天天上网的吧,你给我什么空间啊?嘿嘿~~~
beatles1979 2003-10-18
  • 打赏
  • 举报
回复
对不起了
苦丁
我的地址打错了
应该是beatles_1979@163.com

象你说的
这样就可以支持4.x了么?
希望你能够再给我点关于Mysql的文档什么的
非常感谢了

还有你是天天在网上面吗?

你要是能给我多一点的话
我看看可不可以找点空间给你放上去
songyi 2003-10-18
  • 打赏
  • 举报
回复
MySQLDAC也很不错
beatles1979 2003-10-18
  • 打赏
  • 举报
回复
苦丁

那你可以发一份DBexpress 4.0 驱动给我吗?

我的邮件地址是beatles_10979@163.com

非常感谢!
swotcoder 2003-10-18
  • 打赏
  • 举报
回复
邮件地址无效。。。

使用3.23.58中的libmysql.dll简单的替换3.x DBexpress 驱动所附带的libmysql.dll即可。非常文档,4.x的口碑并不是很好!
swotcoder 2003-10-17
  • 打赏
  • 举报
回复
MySQL 4.0.12的问题其实很容易解决,用4.0的dbExpress驱动换掉里边的libmysql.dll就可以了!或者直接动态加载libmysql.dll一样可以!
beatles1979 2003-10-17
  • 打赏
  • 举报
回复
这有什么
应该的啊
总不能天天做潜水员阿
呵呵

让大家都知道,
事实的真相哦
而且应该详细的说
heavenmusic 2003-10-17
  • 打赏
  • 举报
回复
谢谢分享!!
beatles1979 2003-10-17
  • 打赏
  • 举报
回复
我在网上找了好长时间
却发现我的Mysql4.0.12没人管了
忒郁闷了


呵呵
你老人家在网上阿
也不确认一下啊
把我加为好友哦

shuixin13 2003-10-17
  • 打赏
  • 举报
回复
Good,
要是能再详细一些就太好了
:)
beatles1979 2003-10-17
  • 打赏
  • 举报
回复
其他連接方法:Core Lib, Open ODBC for dbexpress, BDE+ODBC 均沒這個問題,Zeos不支援DataSnap Update


多層架構不能回傳 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


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好像沒這個問題但我反安裝了不能測試


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 名,未知甚麼原因 (我用的是試用版)


不能設定 MySQL Server 的 Port (http://qc.borland.com/wc/wc.exe/details?reportid=3736)
這是所有dbExpress Driver的共同問題,數據庫主機只能設定在預設的 Port

解決法方: Server 只好使用預設 Port

其他連接方法: Core Lib 同樣有這個問題,Open ODBC 及 BDE + ODBC 可透過 Connect String 設定, Zeos 可直接設定



Order by 與 Limit 同用會出錯 (Only, http://qc.borland.com/wc/wc.exe/details?reportid=3740)
Kylix 有這問題,Delphi 好像沒有這個問題。
當 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限制

需要在 http://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 作比較,不但速度極差,而且經常出現錯誤,所以完全放棄了這個方式。


總結

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


其他連結

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)

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧