標籤:
Delphi XE中使用dbExpress串連MySQL資料庫疑難問題解決
Delphi IDE中包含一個Data Explorer的組件,如所示:
該組件基於dbExpress(包含TSQLConnection、TSQLDataSet、TSQLQuery、TSQLStoredProc、TSQLTable、TsqlServerMethod、TSQLMonitor、TSimpleDataSet)。但是因為該組件只提供了各種資料庫的抽象驅動,沒有提供底層的與資料庫直接互動的驅動庫,因此,要想使用具體某種資料庫,還需要搭配供應商驅動。本文以Delphi XE在Windows 7 Ultimate版系統下串連MySQL Community Server 5.5.10資料庫為例,介紹了本人在實現過程中遇到的問題,希望對遇到同樣問題的朋友有所協助。
第一,作者走了一個最大的彎路,為了圖省事,在Windows 7系統中使用的是msi版本的MySQL資料庫(為什麼說是最大的彎路且看下文)。安裝好後啟動服務什麼的折騰了一大圈,關鍵是服務啟動不起來。如果你使用的是圖形化的MySQL Server Instance Configuration Wizard,一定要注意,當選擇資料庫用處為Multifunctional Database 或 Transactional Database Only 時,嚮導會讓你指定 InnoDB Tablespace。你的機器如果以前安裝過MySQL,這個目錄不可以是之前安裝執行個體所使用的InnoDB Tablespace,最好是建立的一個目錄,否則容易引發MySQL服務不能啟動的故障。
第二,為了做測試,沒有在MySQL伺服器中添加額外的使用者賬戶,因為預設策略中,MySQL對root賬戶是禁止遠端存取的,難怪我嘗試本地串連一點問題都沒有,換了另一台在同一個區域網路的機器上登入該伺服器就出錯呢。解決的辦法如下:
進入MySQL的控制台。在cmd中定位到MySQL安裝目錄的bin子目錄,輸入mysql -u root -p,斷行符號後會要求你輸入root賬戶的密碼,如果沒有密碼直接斷行符號,否則輸入root密碼,斷行符號。如果看到mysql>表示成功登入。
切換到使用系統資料庫mysql狀態,輸入:use mysql;斷行符號。
如果你已經設定了root密碼,請忽略此步,否則請輸入 UPDATE user SET Password=PASSWORD(‘your root password‘) WHERE User=‘root‘;斷行符號。其中括弧中引號內輸入的是你指定的root賬戶密碼。語句的最後別忘了以英文分號結尾,斷行符號。這樣就設定了root賬戶的密碼。
輸入:GRANT ALL PRIVILEGES ON *.* TO [email protected]"%" IDENTIFIED BY "root";斷行符號,這樣就設定了root賬戶可以被遠端任何一台電腦登陸,當然,這隻是為了實驗,真正應用環境中不推薦這樣使用,會有很大的安全隱患。
重要的來了,別忘了應用剛才的設定。輸入:FLUSH PRIVILEGES;只有這樣才能讓上一步的使用權限設定生效。
以上這兩點只是為了確保MySQL能夠在Windows 7系統中跑起來,並且能夠被遠端存取,如果你已經做到了以上的兩點,請直接無視(哈哈,說晚了)
這裡之所以使用Data Explorer,是因為在不建立工程的基礎上可以通過它來測試dbExpress是否能串連上MySQL資料庫。展開MySQL節點,修改列出的對應串連,如所示:
參數都配置完成後點擊左下角的“Test Connection”按鈕來測試連接,如果你得到了如所示的提示(Driver could not be properly initialized. Client library may be missing, not installed properly, of the wrong version, or the driver may be missing from the system path.):
那麼就跟著下面的方法走:
將MySQL安裝目錄下lib子目錄中的libmysql.dll檔案拷貝至c:/windows/system32(系統不在c盤的請轉至對應目錄),重新啟動Delphi XE,按照上面的步驟測試連接,你會發現還是出現無法正確初始化資料庫驅動的問題。我被這個問題困擾了三天,最後解決的辦法非常之荒謬,還記得我一開始說的“最大的彎路”嗎?最大的彎路就是使用的是安裝版的MySQL。你只要使用解壓版的MySQL資料庫就沒有問題。其實這裡面真正作祟的還是libmysql.dll。只要從解壓版的MySQL中提取出該版本的libmysql.dll複製到c:/windows/system32目錄下就不會發生無法正確初始化資料庫驅動的問題。
程式開發完畢之後需要對其進行部署。部署的時候不要忘了將dbExpress對應MySQL資料庫的抽象驅動dbxmys.dll和MySQL底層驅動libmysql.dll都與主程式放置在同一個目錄中。
附:文中提到的可用的MySQL資料庫驅動:http://download.csdn.net/source/3114666
Delphi XE中使用dbExpress串連MySQL資料庫疑難問題解決