在基礎版基礎上新增非同步方法、連線池配置建議、例外處理與單元測試範例,適合直接納入專案共用庫。
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
<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);
}
[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,邏輯完全通用。