在 .NET 生態系中連接 MySQL 資料庫,早期常使用第三方驅動程式 MySQLDriverCS (SourceForge 專案)。然而隨著 .Core/.NET 5+ 時代來臨,官方提供的 MySQL Connector/NET (NuGet 套件 MySql.Data 或 MySqlConnector) 已成為標準選擇。本文將回顧傳統做法,並引導開發者遷移至現代、支援跨平台的最佳實務。
早期專案常從 SourceForge 下載 MySQLDriverCS-n-EasyQueryTools-3.0.18.exe,安裝後參考 DLL:
using MySQLDriverCS;
// 建立連線字串
MySQLConnectionString connStr = new MySQLConnectionString(
"localhost", "database_name", "username", "password");
MySQLConnection conn = new MySQLConnection(connStr.AsString);
conn.Open();
// 執行 SQL 命令
MySQLCommand cmd = new MySQLCommand("SELECT * FROM users", conn);
MySQLDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["username"]);
}
reader.Close();
cmd.Dispose();
conn.Close();
# .NET CLI
dotnet add package MySqlConnector
# Package Manager Console
Install-Package MySqlConnector
using System;
using System.Threading.Tasks;
using MySqlConnector;
class Program
{
static async Task Main()
{
// 連線字串建議從設定檔/環境變數讀取
const string connString = "Server=localhost;Database=testdb;User=root;Password=your_password;";
await using var conn = new MySqlConnection(connString);
await conn.OpenAsync();
Console.WriteLine("資料庫連線成功!");
// 參數化查詢 (防止 SQL Injection)
const string sql = "SELECT id, username, email FROM users WHERE status = @status";
await using var cmd = new MySqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@status", "active");
await using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
Console.WriteLine($"ID: {reader.GetInt32(0)}, User: {reader.GetString(1)}, Email: {reader.GetString(2)}");
}
}
}
| 參數 | 預設值 | 說明 |
|---|---|---|
| Pooling | true | 啟用連線池,極大提升高併發效能 |
| Min Pool Size | 0 | 池中保持的最小連線數 |
| Max Pool Size | 100 | 池中最大連線數,依伺服器能力調整 |
| Connection Lifetime | 0 | 連線存活秒數 (0=永久),避免長連線導致資源洩漏 |
| SslMode | Preferred | 生產環境建議 Required 或 VerifyCA/VerifyFull |
Server=db.prod.example.com;Port=3306;Database=myapp;User=app_user;Password=****;
Pooling=true;Min Pool Size=5;Max Pool Size=200;Connection Lifetime=300;
SslMode=VerifyCA;CertificateFile=/path/to/ca.pem;
// 安裝: dotnet add package Dapper
using Dapper;
using MySqlConnector;
public class UserRepository
{
private readonly string _connString;
public UserRepository(string connString) => _connString = connString;
public async Task> GetActiveUsersAsync()
{
await using var conn = new MySqlConnection(_connString);
return await conn.QueryAsync(
"SELECT id, username, email, created_at FROM users WHERE status = @status",
new { status = "active" });
}
public async Task CreateUserAsync(User user)
{
await using var conn = new MySqlConnection(_connString);
const string sql = @"
INSERT INTO users (username, email, password_hash, status)
VALUES (@Username, @Email, @PasswordHash, 'active');
SELECT LAST_INSERT_ID();";
return await conn.ExecuteScalarAsync(sql, user);
}
}
await using var conn = new MySqlConnection(connString);
await conn.OpenAsync();
await using var transaction = await conn.BeginTransactionAsync();
try
{
await conn.ExecuteAsync("UPDATE accounts SET balance = balance - @amt WHERE id = @from",
new { amt = 100, from = 1 }, transaction);
await conn.ExecuteAsync("UPDATE accounts SET balance = balance + @amt WHERE id = @to",
new { amt = 100, to = 2 }, transaction);
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
MySQLDriverCS.dll 參考MySqlConnector NuGet 套件using MySQLDriverCS; → using MySqlConnector;MySQLConnection → MySqlConnectionMySQLCommand → MySqlCommandMySQLDataReader → MySqlDataReaderMySQLConnectionString 類別)ExecuteReaderAsync 等) 提升擴展性| 錯誤訊息 | 原因 | 解決方案 |
|---|---|---|
| Authentication plugin 'caching_sha2_password' not supported | MySQL 8.0+ 預設認證插件舊版驅動不支援 | |
| Too many connections | 連線池耗盡或未正確關閉連線 | 檢查 Max Pool Size;確保使用 await using / using 正確釋放 |
| SSL connection error | 憑證驗證失敗 | 設定 SslMode=Required 並提供 CA 憑證,或開發環境暫用 SslMode=Preferred |
雖然 MySQLDriverCS 曾是 .NET 連接 MySQL 的主流選擇,但隨著技術演進,MySqlConnector 已成為現代 .NET 應用程式連接 MySQL 的最佳選擇:跨平台、高效能、積極維護且完全開源。建議所有新專案直接採用 MySqlConnector,並搭配 Dapper 等微型 ORM 提升開發效率;現有舊專案應規劃遷移以獲得長期支援與安全性更新。