首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ODBC 驅動在 VC、Delphi、VB 中的完整配置與調用指南

     編輯:MySQL 資料庫相關知識

兩種連接架構對比

維度MySQL C API (libmysql)MyODBC (ODBC 驅動)
適用語言C/C++、Delphi、VB (需封裝)所有支援 ODBC 的語言 (VB、VC、Delphi、C#、Python、ASP 等)
部署複雜度需分發 libmysql.dll + 開發庫僅需 myodbc.dll + 系統 DSN 設定
效能原生協議,延遲最低ODBC 層轉換,微小開銷
跨資料庫移植困難,綁定 MySQL極易,只改 DSN/連接字串
ASP/經典 Web 支援不支援 (無 COM)原生支援

MyODBC 5.x 快速部署(僅需 300KB DLL)

1. 取得核心檔案

  • 官網下載 mysql-connector-odbc-5.x-win32.msi 完整安裝包(含 DLL、安裝精靈、幫助文件)
  • 或從安裝包解壓 僅需 myodbc5.dll (Unicode) / myodbc5a.dll (ANSI) + myodbc5S.dll (Setup DLL)

2. 手動註冊驅動(免安裝模式)

; myodbc_reg.reg — 雙擊導入註冊表
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\MySQL ODBC 5.3 Unicode Driver]
"Driver"="C:\\Windows\\System32\\myodbc5.dll"
"Setup"="C:\\Windows\\System32\\myodbc5S.dll"
"DriverODBCVer"="03.50"
"FileUsage"="0"
"ConnectFunctions"="YYY"
"APILevel"="1"
"CPTimeout"="120"

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]
"MySQL ODBC 5.3 Unicode Driver"="Installed"

; 64位系統須同時寫入 Wow6432Node
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\MySQL ODBC 5.3 Unicode Driver]
"Driver"="C:\\Windows\\SysWOW64\\myodbc5.dll"
"Setup"="C:\\Windows\\SysWOW64\\myodbc5S.dll"
... (同上)

3. 建立系統 DSN(供所有使用者/服務使用)

; dsn_mysql.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\MySQL_Test]
"Driver"="C:\\Windows\\System32\\myodbc5.dll"
"SERVER"="192.168.1.100"
"PORT"="3306"
"DATABASE"="mydb"
"USER"="app_user"
"PASSWORD"="EncryptedOrPrompt"
"OPTION"="3"           ; 1=FoundRows, 2=Compress, 4=NamedPipe, 8=NoPrompt, 16=UseCursorLib...
"CHARSET"="utf8mb4"
"INITSTMT"="SET time_zone='+08:00'"

[HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources]
"MySQL_Test"="MySQL ODBC 5.3 Unicode Driver"

各語言調用範例

Visual Basic 6 / VBA / ASP (經典)

' ADO 連接
Dim cn As New ADODB.Connection
cn.ConnectionString = "DSN=MySQL_Test;UID=app_user;PWD=secret;"
cn.Open

' 無 DSN 連接字串
cn.Open "Driver={MySQL ODBC 5.3 Unicode Driver};" & _
        "Server=192.168.1.100;Port=3306;Database=mydb;" & _
        "Uid=app_user;Pwd=secret;Charset=utf8mb4;Option=3;"

' 執行查詢
Dim rs As New ADODB.Recordset
rs.Open "SELECT id, name FROM users WHERE status=1", cn, adOpenForwardOnly, adLockReadOnly
Do Until rs.EOF
    Debug.Print rs("id"), rs("name")
    rs.MoveNext
Loop
rs.Close: cn.Close

Visual C++ (MFC/ATL) - ADO 智慧指標

#import "msado15.dll" no_namespace rename("EOF", "adoEOF")
_ConnectionPtr pConn;
HRESULT hr = pConn.CreateInstance(__uuidof(Connection));
pConn->Open("DSN=MySQL_Test", "app_user", "secret", adConnectUnspecified);

_RecordsetPtr pRs = pConn->Execute("SELECT * FROM products WHERE price > ?", 
    vtMissing, adCmdText);  // 參數化查詢需用 Command 物件

// 參數化範例
_CommandPtr pCmd; pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConn;
pCmd->CommandText = "SELECT * FROM products WHERE price > ?";
pCmd->Parameters->Append(pCmd->CreateParameter("p1", adDouble, adParamInput, 0, 100.0));
pRs = pCmd->Execute();

Delphi (FireDAC / ADO / dbExpress)

{ FireDAC - 推薦現代寫法 }
FDConnection1.Params.DriverID := 'ODBC';
FDConnection1.Params.Add('ODBCAdvanced=DSN=MySQL_Test;UID=app_user;PWD=secret;');
FDConnection1.Connected := True;

FDQuery1.SQL.Text := 'SELECT * FROM orders WHERE order_date >= :dt';
FDQuery1.ParamByName('dt').AsDateTime := Now - 30;
FDQuery1.Open;

{ ADO 組件 }
ADOConnection1.ConnectionString := 'DSN=MySQL_Test;UID=app_user;PWD=secret;';
ADOQuery1.SQL.Text := 'CALL sp_get_sales(?, ?)';
ADOQuery1.Parameters.ParamByName('p1').Value := 2024;
ADOQuery1.Open;

C# / .NET (System.Data.Odbc)

using (var conn = new OdbcConnection("DSN=MySQL_Test;Uid=app_user;Pwd=secret;"))
{
    conn.Open();
    using (var cmd = new OdbcCommand("INSERT INTO logs(msg, lvl) VALUES(?, ?)", conn))
    {
        cmd.Parameters.Add("@msg", OdbcType.VarChar).Value = "測試訊息";
        cmd.Parameters.Add("@lvl", OdbcType.Int).Value = 1;
        cmd.ExecuteNonQuery();
    }
}

進階配置與疑難排解

連接選項 (OPTION 位元組合)

值常數名功能
1FOUND_ROWS回傳影響行數而非匹配行數
2COMPRESS啟用壓縮協議 (慢速網路有效)
8NO_PROMPT禁止彈出對話框 (服務/批次必備)
16USE_CURSOR_LIB強制使用 ODBC 游標庫
32NO_SCHEMA禁止 SHOW TABLES 等 schema 查詢
64READ_ONLY唯讀連線
128AUTO_RECONNECT自動重連 (MySQL 5.7+ 已內建)
256MULTI_STATEMENTS允許多語句批次執行
65536SSL_VERIFY_SERVER_CERT驗證 SSL 憑證

常用組合:Option=3 (FoundRows+Compress) 或 Option=67 (FoundRows+Compress+NoPrompt+ReadOnly)

常見錯誤與對策

  1. 「Data source name not found」 → DSN 名稱拼寫錯誤、32/64 位不匹配 (需用 odbcad32.exe 對應版本建立)
  2. 「Authentication plugin 'caching_sha2_password' not supported」 → MyODBC 5.3 不支援 MySQL 8.0 新認證,升級 8.0 驅動或改用 mysql_native_password
  3. 中文亂碼 → 連接字串加 Charset=utf8mb4、資料庫/表/欄位全鏈路 utf8mb4、驅動版本 ≥ 5.3
  4. 「Lost connection」間歇斷線 → 開啟 Option=128 自動重連、調大 wait_timeout、檢查防火牆空閒超時

總結建議

  • 新專案優先用原生連接器:.NET 用 MySqlConnector、Java 用 Connector/J、Python 用 PyMySQL、Go 用 go-sql-driver/mysql
  • 維護舊系統/跨資料庫/ASP 必須用 ODBC:採用 MySQL 官方 8.0 系列驅動,完整支援 utf8mb4、TLS 1.2、caching_sha2_password
  • 生產環境務必使用系統 DSN + 加密儲存密碼 (Windows Credential Manager / DPAPI / Vault),杜絕明文寫在程式碼/註冊表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved