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

C# 精簡版 MySqlHelper 封裝(支援非同步、參數化、DataTable/DataReader、連線池整合)

     編輯:MySQL 綜合教學

C# 精簡版 MySqlHelper 封裝(進階版)

在基礎版基礎上新增非同步方法、連線池配置建議、例外處理與單元測試範例,適合直接納入專案共用庫。

完整程式碼

using System;
using System.Data;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Configuration;

public static class MySqlHelper
{
    private static readonly string ConnStr = ConfigurationManager.ConnectionStrings["MySqlConn"].ConnectionString;

    public static MySqlConnection CreateConnection()
    {
        var conn = new MySqlConnection(ConnStr);
        conn.Open();
        return conn;
    }

    // === 同步方法 ===
    public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = CreateConnection())
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteNonQuery();
        }
    }

    public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = CreateConnection())
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteScalar();
        }
    }

    public static MySqlDataReader ExecuteReader(string sql, params MySqlParameter[] parameters)
    {
        var conn = CreateConnection();
        var cmd = conn.CreateCommand();
        cmd.CommandText = sql;
        if (parameters != null) cmd.Parameters.AddRange(parameters);
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }

    public static DataTable ExecuteDataTable(string sql, params MySqlParameter[] parameters)
    {
        var table = new DataTable();
        using (var conn = CreateConnection())
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            using (var adapter = new MySqlDataAdapter(cmd))
                adapter.Fill(table);
        }
        return table;
    }

    // === 非同步方法 (.NET 4.5+) ===
    public static async Task ExecuteNonQueryAsync(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = new MySqlConnection(ConnStr))
        using (var cmd = conn.CreateCommand())
        {
            await conn.OpenAsync();
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            return await cmd.ExecuteNonQueryAsync();
        }
    }

    public static async Task ExecuteScalarAsync(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = new MySqlConnection(ConnStr))
        using (var cmd = conn.CreateCommand())
        {
            await conn.OpenAsync();
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            return await cmd.ExecuteScalarAsync();
        }
    }

    public static async Task ExecuteDataTableAsync(string sql, params MySqlParameter[] parameters)
    {
        var table = new DataTable();
        using (var conn = new MySqlConnection(ConnStr))
        using (var cmd = conn.CreateCommand())
        {
            await conn.OpenAsync();
            cmd.CommandText = sql;
            if (parameters != null) cmd.Parameters.AddRange(parameters);
            using (var adapter = new MySqlDataAdapter(cmd))
                await Task.Run(() => adapter.Fill(table));
        }
        return table;
    }
}


連線字串配置 (App.config/Web.config)

<connectionStrings>
  <add name="MySqlConn" 
       connectionString="Server=localhost;Port=3306;Database=mydb;Uid=root;Pwd=123456;CharSet=utf8mb4;Pooling=true;MinPoolSize=5;MaxPoolSize=100;ConnectionTimeout=30;" 
       providerName="MySql.Data.MySqlClient" />
</connectionStrings>

使用範例

// 同步
int count = Convert.ToInt32(MySqlHelper.ExecuteScalar("SELECT COUNT(*) FROM users WHERE active=1"));
var dt = MySqlHelper.ExecuteDataTable("SELECT * FROM orders WHERE user_id=@uid", new MySqlParameter("@uid", 100));

// 非同步 (ASP.NET Core / Web API 推薦)
public async Task GetUsers()
{
    var dt = await MySqlHelper.ExecuteDataTableAsync("SELECT id, name FROM users WHERE status=@s", new MySqlParameter("@s", 1));
    return Ok(dt);
}

設計重點

  • static 類別:無狀態,執行緒安全
  • using 區塊:確保連線/命令/適配器釋放
  • 參數化:防注入,支援 params 彈性
  • ExecuteReader 回傳 CloseConnection:呼叫端 using reader 即可
  • 非同步配對:OpenAsync/ExecuteNonQueryAsync/ExecuteScalarAsync,避免阻塞執行緒
  • 連線池:連線字串啟用 Pooling、Min/MaxPoolSize

單元測試範例 (xUnit)

[Fact]
public async Task ExecuteScalarAsync_ReturnsCount()
{
    var count = await MySqlHelper.ExecuteScalarAsync("SELECT COUNT(*) FROM users");
    Assert.IsType(count);
    Assert.True((long)count > 0);
}
將命名空間 MySql.Data.MySqlClient 替換為 System.Data.SqlClient 即可變身 SqlServerHelper,邏輯完全通用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved