164 lines
6.3 KiB
C#
Raw Normal View History

2026-01-29 20:29:12 +08:00
using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using MQTT_WinformV1;
using MySql.Data.MySqlClient;
using YiDa_WinForm.Config;
namespace YiDa_WinForm
{
/// <summary>
/// MySQL 数据库公共辅助类(封装通用数据库操作)
/// </summary>
public static class DbHelper
{
// 从统一配置类获取连接字符串
private static readonly string _connectionString = AppConfigHelper.MySqlConnectionString;
#region 1. INSERT/UPDATE/DELETE
/// <summary>
/// 异步执行无返回值SQLINSERT/UPDATE/DELETE
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameters">SQL参数集合可选用于防止SQL注入</param>
/// <returns>受影响的行数</returns>
public static async Task<int> ExecuteNonQueryAsync(string sql, MySqlParameter[] parameters = null)
{
// 验证SQL有效性
if (string.IsNullOrEmpty(sql))
{
throw new ArgumentNullException(nameof(sql), "SQL语句不能为空");
}
using (var conn = new MySqlConnection(_connectionString))
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand(sql, conn))
{
// 添加参数
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
// 异步执行命令并返回受影响行数
return await cmd.ExecuteNonQueryAsync();
}
}
}
#endregion
#region 2. SELECTDataTable
/// <summary>
/// 异步执行查询SQL返回DataTable结果集
/// </summary>
/// <param name="sql">查询SQL语句</param>
/// <param name="parameters">SQL参数集合可选</param>
/// <returns>查询结果DataTable</returns>
public static async Task<DataTable> ExecuteQueryAsync(string sql, MySqlParameter[] parameters = null)
{
// 验证SQL有效性
if (string.IsNullOrEmpty(sql))
{
throw new ArgumentNullException(nameof(sql), "SQL语句不能为空");
}
DataTable dt = new DataTable();
using (var conn = new MySqlConnection(_connectionString))
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand(sql, conn))
{
// 添加参数(若有)
if (parameters != null && parameters.Length > 0)
{
cmd.Parameters.AddRange(parameters);
}
// 异步获取数据读取器并填充DataTable
using (var reader = await cmd.ExecuteReaderAsync())
{
dt.Load(reader);
}
}
}
return dt;
}
#endregion
#region 3.
/// <summary>
/// 异步批量执行SQL修复循环执行确保每条数据都提交
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="parameterAction">参数赋值委托</param>
public static async Task ExecuteBatchNonQueryAsync(string sql, Action<MySqlCommand> parameterAction)
{
if (string.IsNullOrEmpty(sql))
{
throw new ArgumentNullException(nameof(sql), "SQL语句不能为空");
}
if (parameterAction == null)
{
throw new ArgumentNullException(nameof(parameterAction), "参数赋值委托不能为空");
}
// 修复每个参数执行一次SQL确保不遗漏
using (var conn = new MySqlConnection(_connectionString))
{
await conn.OpenAsync();
using (var cmd = new MySqlCommand(sql, conn))
{
parameterAction.Invoke(cmd);
await cmd.ExecuteNonQueryAsync();
}
}
}
#endregion
/// <summary>
/// 批量执行INSERT语句优化性能减少连接创建/销毁)
/// </summary>
/// <param name="sql">批量INSERT的SQL语句带参数占位符</param>
/// <param name="parametersList">批量参数列表(每个元素对应一行数据的参数)</param>
/// <returns>受影响的行数</returns>
public static async Task<int> ExecuteBatchInsertAsync(string sql, List<MySqlParameter[]> parametersList)
{
if (string.IsNullOrEmpty(sql))
{
throw new ArgumentNullException(nameof(sql), "SQL语句不能为空");
}
if (parametersList == null || parametersList.Count == 0)
{
return 0;
}
using (var conn = new MySqlConnection(_connectionString))
{
await conn.OpenAsync();
// 开启事务,确保批量插入的原子性(要么全部成功,要么全部失败)
using (var transaction = await conn.BeginTransactionAsync())
{
using (var cmd = new MySqlCommand(sql, conn, transaction))
{
int totalAffectedRows = 0;
foreach (var parameters in parametersList)
{
cmd.Parameters.Clear();
cmd.Parameters.AddRange(parameters);
// 执行单条INSERT复用连接和事务
totalAffectedRows += await cmd.ExecuteNonQueryAsync();
}
// 批量提交事务
await transaction.CommitAsync();
return totalAffectedRows;
}
}
}
}
}
}