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; } } } } } }