首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

C# 連接 MySQL 完整實戰:MySqlConnector 與 MySqlDriverCS 兩大方案對比

     編輯:MySQL 綜合教學

C# 連接 MySQL 完整實戰

.NET 應用連接 MySQL 主流有兩套方案:官方推薦的 MySqlConnector(原 MySql.Data)與輕量級的 MySqlDriverCS。本文提供兩者完整程式碼範例、效能特性對比、遷移建議與最佳實踐模式。

方案一:MySqlConnector (官方推薦、效能最佳、.NET Core/5/6/7/8 全支援)

NuGet 套件:MySqlConnector (推薦) 或 MySql.Data (舊版官方)

1. 基礎連線與查詢 (ADO.NET 模式)

using System;
using System.Data;
using MySqlConnector; // 或 using MySql.Data.MySqlClient;

public class MySqlDemo
{
    private readonly string _connStr = "Server=localhost;Database=testdb;Uid=root;Pwd=123456;Charset=utf8mb4;SslMode=Preferred;";

    public void QueryData()
    {
        using var conn = new MySqlConnection(_connStr);
        conn.Open();

        using var cmd = new MySqlCommand("SELECT id, name, email FROM users WHERE status = @status ORDER BY id DESC LIMIT 10", conn);
        cmd.Parameters.AddWithValue("@status", 1);

        using var reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine($"ID: {reader.GetInt32(0)}, Name: {reader.GetString(1)}, Email: {reader.GetString(2)}");
        }
    }

    public int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
    {
        using var conn = new MySqlConnection(_connStr);
        using var cmd = new MySqlCommand(sql, conn);
        if (parameters != null) cmd.Parameters.AddRange(parameters);
        conn.Open();
        return cmd.ExecuteNonQuery();
    }
}

2. 連線字串關鍵參數

3. 進階模式:Dapper 輕量 ORM (強烈推薦)

// NuGet: Dapper + MySqlConnector
using Dapper;

public class UserRepository
{
    private readonly string _connStr;

    public UserRepository(string connStr) => _connStr = connStr;

    public IEnumerable GetActiveUsers(int limit = 10)
    {
        using var conn = new MySqlConnection(_connStr);
        return conn.Query("SELECT id, name, email FROM users WHERE status = 1 ORDER BY id DESC LIMIT @limit", new { limit });
    }

    public int CreateUser(User user)
    {
        using var conn = new MySqlConnection(_connStr);
        var sql = @"INSERT INTO users (name, email, status, created_at) VALUES (@Name, @Email, @Status, NOW());
                    SELECT LAST_INSERT_ID();";
        return conn.ExecuteScalar(sql, user);
    }
}

public class User { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public int Status { get; set; } }

方案二:MySqlDriverCS (輕量、無相依、適合簡單專案/舊版 .NET Framework)

⚠️ 注意:此專案已停止維護,不建議新專案使用,僅供維護舊系統參考。

基礎用法

using System;
using System.Data;
using MySqlDriverCS;

public class LegacyMySqlDemo
{
    public void QueryWithDriverCS()
    {
        // 連線字串格式不同
        var connStr = new MySqlConnectionString("localhost", "testdb", "root", "123456").AsString;
        
        using var conn = new MySqlConnection(connStr);
        conn.Open();

        // 設定字元集 (DriverCS 需手動執行)
        using var charsetCmd = new MySqlCommand("SET NAMES utf8mb4", conn);
        charsetCmd.ExecuteNonQuery();

        using var cmd = new MySqlCommand("SELECT * FROM users", conn);
        using var adapter = new MySqlDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds, "users");

        foreach (DataRow row in ds.Tables["users"].Rows)
        {
            Console.WriteLine($"{row["id"]} - {row["name"]}");
        }
    }
}

兩大方案深度對比

參數說明建議值
Server主機位址localhost / 192.168.1.100
Port埠號3306 (預設可省略)
Database資料庫名your_db
Uid/Pwd帳號/密碼專用帳號、強密碼
Charset字元集utf8mb4 (支援 emoji)
SslModeSSL 模式Preferred / Required / None
ConnectionReset從連線池取出時重置true (避免髒讀)
MaxPoolSize/MinPoolSize連線池大小100/0 (視負載調整)
AllowUserVariables允許用戶變數true (需用 @var 時)
維度MySqlConnectorMySqlDriverCS
維護狀態活躍開源,每月更新2012 年後停止更新
目標框架.NET Framework 4.6.1+ / .NET Standard 2.0+ / .NET 5-8.NET Framework 2.0-4.x
效能高 (管線化、非同步 IO、Span 支援)基礎
功能完整度完整支援 JSON、GIS、Prepared Statement 重用、X Protocol基礎 CRUD
連線池內建高效連線池簡易實作
非同步支援完整 async/await無
相依性無額外相依 (純 managed)單一 DLL
授權MITLGPL

遷移指南:從 MySql.Data / MySqlDriverCS 升級至 MySqlConnector

  1. 移除舊套件:`Uninstall-Package MySql.Data` 或移除 MySqlDriverCS 參考
  2. 安裝新套件:`Install-Package MySqlConnector`
  3. 命名空間統一:`using MySqlConnector;` (類別名稱相容:MySqlConnection、MySqlCommand 等)
  4. 連線字串調整:補上 Charset=utf8mb4、SslMode=Preferred
  5. 測試非同步方法:將同步呼叫改為 `await cmd.ExecuteReaderAsync()` 等

生產環境最佳實踐清單

  • ✅ 使用 連線池:預設開啟,勿在 using 區塊外長期持有連線
  • ✅ 參數化查詢:杜絕 SQL 注入,cmd.Parameters.AddWithValue()
  • ✅ 異步程式設計:Web API 必須用 `ExecuteReaderAsync`、`OpenAsync` 避免阻塞執行緒
  • ✅ 連線字串外部化:存放於 `appsettings.json` / 環境變數 / Key Vault
  • ✅ 啟用重試策略:Polly + MySqlConnector 處理暫時性錯誤 (Deadlock、Timeout)
  • ✅ 監控慢查詢:`long_query_time=1` + `log_slow_queries=ON` + 應用層 APM
  • ✅ 字元集統一 utf8mb4:資料庫、表、連線字串、C# 字串全鏈路一致

常見問題排查

問題可能原因解決方案
Authentication plugin 'caching_sha2_password' not supportedMySQL 8.0 預設認證插件舊驅動不支援升級 MySqlConnector 2.0+ / 建立用戶指定 mysql_native_password
SSL Connection error伺服器啟用 SSL 但客戶端未配置連線字串加 `SslMode=Preferred` 或 `SslMode=Required` + 憑證
Connection timeout / Pool exhausted連線洩漏 / 池太小 / 查詢過慢檢查 using 區塊 / 增加 MaxPoolSize / 優化查詢 / 監控泄漏
Character set 'utf8mb4' unsupportedMySQL 版本過舊 (< 5.5.3)升級 MySQL / 改用 utf8 (不支援 emoji)

現代 .NET 開發請直接選擇 MySqlConnector,配合 Dapper 或 Entity Framework Core 使用,能獲得最佳效能、功能完整度與長期維護保障。舊專案維護期滿後應規劃遷移路線圖。

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