2026-01-29 20:29:12 +08:00

164 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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