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
{
///
/// MySQL 数据库公共辅助类(封装通用数据库操作)
///
public static class DbHelper
{
// 从统一配置类获取连接字符串
private static readonly string _connectionString = AppConfigHelper.MySqlConnectionString;
#region 1. 通用无返回值执行方法(适用于 INSERT/UPDATE/DELETE)
///
/// 异步执行无返回值SQL(INSERT/UPDATE/DELETE)
///
/// SQL语句
/// SQL参数集合(可选,用于防止SQL注入)
/// 受影响的行数
public static async Task 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. 通用有返回值查询方法(适用于 SELECT,返回DataTable)
///
/// 异步执行查询SQL,返回DataTable结果集
///
/// 查询SQL语句
/// SQL参数集合(可选)
/// 查询结果DataTable
public static async Task 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. 批量执行无返回值方法(修复:改为循环执行,确保每条数据都插入)
///
/// 异步批量执行SQL(修复:循环执行,确保每条数据都提交)
///
/// SQL语句
/// 参数赋值委托
public static async Task ExecuteBatchNonQueryAsync(string sql, Action 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
///
/// 批量执行INSERT语句(优化性能,减少连接创建/销毁)
///
/// 批量INSERT的SQL语句(带参数占位符)
/// 批量参数列表(每个元素对应一行数据的参数)
/// 受影响的行数
public static async Task ExecuteBatchInsertAsync(string sql, List 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;
}
}
}
}
}
}