首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 連接 MySQL 完整指南:從 MySQLDriverCS 到現代最佳實務

     編輯:關於C語言

前言

在 .NET 生態系中連接 MySQL 資料庫,早期常使用第三方驅動程式 MySQLDriverCS (SourceForge 專案)。然而隨著 .Core/.NET 5+ 時代來臨,官方提供的 MySQL Connector/NET (NuGet 套件 MySql.Data 或 MySqlConnector) 已成為標準選擇。本文將回顧傳統做法,並引導開發者遷移至現代、支援跨平台的最佳實務。

歷史回顧:MySQLDriverCS 用法 (僅供參考)

早期專案常從 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();
⚠ 注意: MySQLDriverCS 專案已停止維護,不支援 .NET Core / .NET 5+,且存在已知安全性問題。新專案請勿使用。

現代標準:MySqlConnector (推薦)

為什麼選擇 MySqlConnector?

  • ✅ 完全開源 (MIT License)、社群活躍維護
  • ✅ 支援 .NET Framework 4.6.1+、.NET Core 2.1+、.NET 5/6/7/8
  • ✅ 真正的非同步 I/O 實作,效能優異
  • ✅ 支援連線池、SSL、Prepared Statements 等進階功能

安裝方式

# .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;

資料操作最佳實務

1. 使用 Dapper 簡化 ORM 操作 (推薦)

// 安裝: 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);
    }
}

2. 交易處理範例

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 升級

  1. 移除舊版 MySQLDriverCS.dll 參考
  2. 安裝 MySqlConnector NuGet 套件
  3. 命名空間變更:using MySQLDriverCS; → using MySqlConnector;
  4. 類別名稱對應:
    • MySQLConnection → MySqlConnection
    • MySQLCommand → MySqlCommand
    • MySQLDataReader → MySqlDataReader
  5. 連線字串格式標準化 (移除 MySQLConnectionString 類別)
  6. 將同步呼叫改為非同步 (ExecuteReaderAsync 等) 提升擴展性

常見問題排查

  • 使用 MySqlConnector 2.0+ (已支援)
  • 或建立使用者指定 mysql_native_password
  • 錯誤訊息 原因 解決方案
    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 提升開發效率;現有舊專案應規劃遷移以獲得長期支援與安全性更新。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved