《C#操作MySQL的工具类MySqlHelper》
在.NET开发中,数据库操作是核心功能之一。MySQL作为开源关系型数据库的代表,与C#的结合广泛应用于企业级应用开发。本文将详细介绍如何设计一个高效、可复用的MySqlHelper工具类,涵盖连接管理、参数化查询、事务处理等关键功能,并提供完整的代码实现与使用示例。
一、工具类设计目标
MySqlHelper工具类的核心目标是简化C#对MySQL的操作流程,解决以下痛点:
重复编写连接字符串与连接对象管理代码
手动处理参数化查询的繁琐过程
事务操作的复杂性导致代码冗余
缺乏统一的异常处理机制
通过封装常用操作,开发者可以专注于业务逻辑实现,提升代码可维护性。
二、核心功能实现
1. 连接管理
使用单例模式管理MySQL连接,避免频繁创建销毁连接对象。配置信息通过App.config或硬编码方式存储。
public class MySqlHelper
{
private static readonly string ConnectionString = "server=localhost;user=root;database=test;port=3306;password=123456;";
private static MySqlConnection GetConnection()
{
return new MySqlConnection(ConnectionString);
}
}
2. 基础CRUD操作
实现ExecuteNonQuery(增删改)、ExecuteScalar(单值查询)、ExecuteReader(多行查询)三个核心方法。
// 执行非查询操作(返回影响行数)
public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
// 执行查询返回首行首列
public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}
}
// 执行查询返回DataReader
public static MySqlDataReader ExecuteReader(string sql, params MySqlParameter[] parameters)
{
var conn = GetConnection();
conn.Open();
var cmd = new MySqlCommand(sql, conn);
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
3. 参数化查询封装
通过MySqlParameter数组实现安全查询,防止SQL注入。
// 示例:查询用户信息
var sql = "SELECT * FROM Users WHERE Username = @username AND Password = @password";
var parameters = new[]
{
new MySqlParameter("@username", "admin"),
new MySqlParameter("@password", "123456")
};
using (var reader = MySqlHelper.ExecuteReader(sql, parameters))
{
while (reader.Read())
{
Console.WriteLine($"ID: {reader["Id"]}, Name: {reader["Username"]}");
}
}
4. 事务处理支持
封装事务操作,确保多表更新的原子性。
public static void ExecuteTransaction(Action action)
{
using (var conn = GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
action(trans);
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
}
}
// 使用示例
MySqlHelper.ExecuteTransaction(trans =>
{
var sql1 = "UPDATE Account SET Balance = Balance - 100 WHERE Id = 1";
var sql2 = "UPDATE Account SET Balance = Balance + 100 WHERE Id = 2";
using (var cmd1 = new MySqlCommand(sql1, trans.Connection, trans))
using (var cmd2 = new MySqlCommand(sql2, trans.Connection, trans))
{
cmd1.ExecuteNonQuery();
cmd2.ExecuteNonQuery();
}
});
5. 异步操作支持(.NET Core+)
针对高并发场景,提供异步方法实现。
public static async Task ExecuteNonQueryAsync(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return await cmd.ExecuteNonQueryAsync();
}
}
}
// 调用示例
await MySqlHelper.ExecuteNonQueryAsync(
"INSERT INTO Logs (Message) VALUES (@msg)",
new MySqlParameter("@msg", "System started")
);
三、高级功能扩展
1. 批量操作优化
使用MySqlBulkLoader实现大数据量导入。
public static void BulkInsert(string tableName, string filePath, char[] fieldTerminator = null)
{
var loader = new MySqlBulkLoader(GetConnection())
{
TableName = tableName,
FileName = filePath,
FieldTerminator = fieldTerminator ?? ",",
NumberOfLinesToSkip = 1
};
loader.Load();
}
2. 存储过程调用
public static object ExecuteProcedure(string procedureName, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(procedureName, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}
}
3. 连接池配置
在连接字符串中优化连接池参数:
// 推荐配置
"server=...;pooling=true;MinimumPoolSize=5;MaximumPoolSize=100;ConnectionLifetime=300;"
四、最佳实践与注意事项
1. 连接管理:始终使用using语句确保连接释放
2. 异常处理:捕获MySqlException并记录详细错误信息
3. 性能优化:
避免在循环中频繁创建连接
批量操作时使用事务
合理设置连接池参数
4. 安全建议:
敏感信息(如密码)使用加密存储
最小权限原则配置数据库用户
五、完整工具类代码
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Threading.Tasks;
public static class MySqlHelper
{
private static readonly string ConnectionString = "server=localhost;user=root;database=test;port=3306;password=123456;";
// 同步方法
public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
}
}
}
public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteScalar();
}
}
}
public static MySqlDataReader ExecuteReader(string sql, params MySqlParameter[] parameters)
{
var conn = GetConnection();
conn.Open();
var cmd = new MySqlCommand(sql, conn);
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}
// 异步方法
public static async Task ExecuteNonQueryAsync(string sql, params MySqlParameter[] parameters)
{
using (var conn = GetConnection())
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand(sql, conn))
{
if (parameters != null)
cmd.Parameters.AddRange(parameters);
return await cmd.ExecuteNonQueryAsync();
}
}
}
// 事务处理
public static void ExecuteTransaction(Action action)
{
using (var conn = GetConnection())
{
conn.Open();
using (var trans = conn.BeginTransaction())
{
try
{
action(trans);
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
}
}
private static MySqlConnection GetConnection()
{
return new MySqlConnection(ConnectionString);
}
}
关键词:C#、MySQL、工具类、参数化查询、事务处理、异步操作、连接池、存储过程、批量导入
简介:本文详细介绍了C#中操作MySQL数据库的MySqlHelper工具类设计与实现,涵盖连接管理、CRUD操作、事务处理、异步支持等核心功能,提供完整代码示例与最佳实践建议,帮助开发者快速构建高效、安全的数据库访问层。