.NET 生態中操作 MySQL 主要有兩種成熟方案:官方 MySqlConnector (原 MySQL Connector/NET) 和社區驅動 MySqlDriverCS。本文通過完整代碼示例對比兩者的配置、API 差異與使用體驗。
Install-Package MySqlConnector(推薦,跨平台、高性能、活躍維護)MySql.Data (Oracle 維護,僅 Windows、更新較慢)using System;
using MySqlConnector; // 或 MySql.Data.MySqlClient
namespace MySqlDemo {
class Program {
static void Main(string[] args) {
// 連接字符串構建
var connStr = "Server=127.0.0.1;Port=3306;Database=student;Uid=root;Pwd=root;Charset=utf8mb4;SslMode=Preferred;";
using (var conn = new MySqlConnection(connStr)) {
try {
conn.Open();
Console.WriteLine("連接成功!");
// 查詢示例
const string sql = "SELECT * FROM stuinfo";
using (var cmd = new MySqlCommand(sql, conn))
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
// 獲取數據:按索引或列名
Console.WriteLine($"{reader["id"]}\t{reader["first_name"]}\t{reader["last_name"]}\t{reader["Birthdate"]}");
}
}
// 參數化插入示例
const string insertSql = "INSERT INTO stuinfo(first_name, last_name, Birthdate) VALUES(@fn, @ln, @bd)";
using (var cmd = new MySqlCommand(insertSql, conn)) {
cmd.Parameters.AddWithValue("@fn", "Alice");
cmd.Parameters.AddWithValue("@ln", "Johnson");
cmd.Parameters.AddWithValue("@bd", new DateTime(1995, 3, 15));
int rows = cmd.ExecuteNonQuery();
Console.WriteLine($"插入 {rows} 行");
}
} catch (Exception ex) {
Console.WriteLine("錯誤: " + ex.Message);
}
} // 自動釋放連接
Console.ReadKey();
}
}
}
OpenAsync、ExecuteReaderAsync、ExecuteNonQueryAsyncPooling=true(默認開啟)@param 語法,類型安全MySQLDriverCS.dllusing System;
using System.Data; // 需要引用
using MySQLDriverCS;
namespace MySqlDriverDemo {
class Program {
static void Main(string[] args) {
// 連接字符串構建器
var connStr = new MySQLConnectionString("127.0.0.1", "student", "root", "root", 3306).AsString;
using (var conn = new MySQLConnection(connStr)) {
try {
conn.Open();
Console.WriteLine("連接成功!");
using (var cmd = new MySQLCommand("SELECT * FROM stuinfo", conn))
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine($"{reader.GetString(0)}\t{reader.GetString(1)}\t{reader.GetString(2)}\t{reader.GetString(3)}");
}
}
} catch (Exception ex) {
Console.WriteLine("錯誤: " + ex.Message);
}
}
Console.ReadKey();
}
}
}
GetString(index) 強制按索引)| 維度 | MySqlConnector (推薦) | MySqlDriverCS (不推薦新項目) |
|---|---|---|
| 平台支持 | .NET Framework / .NET Core / .NET 5+ / Mono | 僅 .NET Framework |
| 包管理 | NuGet (MySqlConnector / MySql.Data) | 手動引用 DLL |
| 異步支持 | 完整異步 API | 無 |
| 連接池 | 內置,高度可配置 | 無/基礎 |
| 參數綁定 | @paramName (命名參數) | ? 或 位置參數 |
| 數據讀取 | reader["colName"] / reader.GetFieldValue<T>() | reader.GetString(index) 等強類型按索引 |
| 維護狀態 | 活躍 (GitHub 開源) | 停止維護 |
| 性能 | 高 (Span/Memory 優化) | 一般 |
dotnet add package MySqlConnectorCharset=utf8mb4:支持 emoji/完整 UnicodeSslMode=Preferred:生產環境建議 Required 並配置憑證Pooling=true;MinPoolSize=5;MaxPoolSize=100:根據並發調整await cmd.ExecuteReaderAsync() 釋放線程| 舊代碼 | 新代碼 |
|---|---|
MySQLConnection | MySqlConnection |
MySQLCommand | MySqlCommand |
MySQLConnectionString(...).AsString | 標準連接字符串或 MySqlConnectionStringBuilder |
reader.GetString(index) | reader.GetString("colName") 或 reader["colName"] |
| 無異步 | await conn.OpenAsync() 等 |
C# 操作 MySQL 的現代標準答案是 MySqlConnector(NuGet 包名 MySqlConnector)。它提供跨平台支持、完整異步 API、高性能連接池、優雅的參數綁定和活躍的社區維護。MySqlDriverCS 作為歷史產物僅用於維護極老舊 .NET Framework 項目。新項目請直接採用 MySqlConnector,並配合 Dapper 或 EF Core 進一步提升開發效率。