.NET Framework 原生僅完整支援 SQL Server,若需存取 MySQL,官方建議透過 ODBC.NET Provider,但需預先設定 DSN,部署麻煩。開源專案 MySQLDriverCS 直接封裝 MySQL 官方 C API (libmysql.dll),提供純 .NET 的 ADO.NET 風格介面,免 DSN、效能更優,成為早期 .NET 連接 MySQL 的主流選擇。
MySQLDriverCS 核心在 CPrototypes.cs,透過 DllImport 屬性將 libmysql.dll 的 C 函式對應為 unsafe 靜態外部方法,例如:
[DllImport("libmysql.dll", EntryPoint="mysql_real_connect")]
unsafe public static extern void* mysql_real_connect(void* mysql, string host, string user, string passwd, string db, uint port, string unix_socket, int client_flag);
[DllImport("libmysql.dll", EntryPoint="mysql_query")]
unsafe public static extern int mysql_query(void* mysql, string query);
[DllImport("libmysql.dll", EntryPoint="mysql_store_result")]
unsafe public static extern void* mysql_store_result(void* mysql);
上層再以 Managed 類別 (MySQLConnection, MySQLCommand, MySQLDataReader 等) 封裝指標操作、記憶體管理與資料型別轉換,對外呈現標準 ADO.NET 模式。
MySQL 4.1.2 後結構體欄位變更,驅動程式以 MySQL_FIELD_FACTORY 依運行時客戶端版本動態回傳 MYSQL_FIELD_VERSION_3 或 MYSQL_FIELD_VERSION_5 實作,皆實作 IMySQL_FIELD 介面,確保欄位中繼資料存取相容。
驅動內建完整對應表,如 FIELD_TYPE_VAR_STRING=253, FIELD_TYPE_LONG_BLOB=251, FIELD_TYPE_DATETIME 等,對應 MySQL_com.h 定義,確保 MySQLDataReader.GetFieldType 正確回傳 .NET 型別。
libmysql.dll 版本與目標 MySQL Server 相容 (建議同主版本)。libmysql.dll 放置於應用程式目錄或系統 PATH 可達路徑。Server=localhost;Database=test;Uid=root;Pwd=123456;Pooling=true;Min Pool Size=5;Max Pool Size=100;using MySQLDriverCS; // 命名空間
using (MySQLConnection conn = new MySQLConnection(connStr)) {
conn.Open();
using (MySQLCommand cmd = new MySQLCommand("SELECT * FROM users WHERE id=@id", conn)) {
cmd.Parameters.AddWithValue("@id", 1);
using (MySQLDataReader dr = cmd.ExecuteReader()) {
while (dr.Read()) Console.WriteLine(dr["name"]);
}
}
}
MySQLDriverCS 展示了 .NET 透過 P/Invoke 整合高效能 C 資料庫客戶端的經典架構。雖已停止更新,但其設計思路(Unmanaged 封裝、版本適配工廠、ADO.NET 介面一致性)仍具參考價值。現代專案請直接採用 Oracle 官方維護的 MySQL Connector/NET (NuGet: MySql.Data),獲得長期支援與最佳效能。