.NET 應用連接 MySQL,歷經 OleDb(不支援)、ODBC.NET、MySQLDriverCS、MySql.Data (Connector/NET) 多代演進。本文回顧經典兩大方案架構差異、代碼範例、十萬次讀寫實測對比,並給出現代選型建議。
System.Data.OleDb 依賴 MSDASQL (OLE DB Provider for ODBC),MySQL ODBC 驅動未正確實作該介面,拋出「不支援 MSDASQL 提供程式」錯誤。官方早已棄用此路徑。
.NET App → System.Data.Odbc → ODBC Driver Manager → MySQL ODBC Driver (myodbc) → MySQL Server
System.Data.Odbc.dll (獨立下載或 .NET Framework 1.1+ 內建)。| ADO.NET 標準 | ODBC.NET 類別 |
|---|---|
| Connection | OdbcConnection |
| Command | OdbcCommand |
| DataAdapter | OdbcDataAdapter |
| DataReader | OdbcDataReader |
string connStr = "DSN=MySQL_DSN;UID=root;PWD=password;";
.NET App → MySQLDriverCS (Managed TCP/IP 協議) → MySQL Server
-- 無 ODBC 層、無 DSN、無非託管組件
MySQLConnection, MySQLCommand, MySQLDataAdapter, MySQLDataReader
ExecuteReader() → ExecuteReaderEx() (舊版 API)。Data Source=localhost;User ID=root;Password=pwd;Database=test;| 指標 | ODBC.NET | MySQLDriverCS | 差異 |
|---|---|---|---|
| 總耗時 | ~24 秒 | ~17 秒 | MySQLDriverCS 快 29% |
| 架構開銷 | Managed → Unmanaged (ODBC) → Kernel → Network | Managed → Network (直通) | 少兩次轉換 |
| 部署複雜度 | 高 (MDAC+Driver+DSN) | 低 (單 DLL) | MySQLDriverCS 勝 |
測試代碼結構:
for(i=0;i<100000;i++) cmd.ExecuteNonQuery(); 批量插入 → ExecuteReader 全讀 → DELETE 清理。
首選:Oracle 官方 MySql.Data (Connector/NET)
Install-Package MySql.Data 或 MySqlConnector (社區高效能分支)。避坑:舊專案若仍用 ODBC.NET/MySQLDriverCS,規劃遷移至 MySqlConnector,代碼改動極小(命名空間 MySql.Data.MySqlClient → MySqlConnector)。
| 操作 | ODBC.NET | MySqlConnector |
|---|---|---|
| 連接 | new OdbcConnection(dsn) | new MySqlConnection(cs) |
| 命令 | new OdbcCommand(sql, conn) | new MySqlCommand(sql, conn) |
| 讀取 | cmd.ExecuteReader() | await cmd.ExecuteReaderAsync() |
| 參數化 | cmd.Parameters.Add("@p", val) | cmd.Parameters.AddWithValue("@p", val) |