164 lines
6.3 KiB
C#
164 lines
6.3 KiB
C#
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>
|
||
/// 异步执行无返回值SQL(INSERT/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. 通用有返回值查询方法(适用于 SELECT,返回DataTable)
|
||
/// <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;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |