Files
RBMESAPICore/Controllers/Interface/KDSqlHelper.cs
yuyubohh e8494ba988 qqq
2025-09-09 22:41:29 +08:00

300 lines
11 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 Microsoft.Data.SqlClient;
using System.Data;
using System.Data.Common;
using RB_MES_API.Context;
namespace RB_MES_API.Controllers
{
/// <summary>
/// SQL帮助类
/// </summary>
public class KDSqlHelper : IKDSqlHelper
{
private readonly RBContext _context;
/// <summary>
/// 依赖性注入
/// </summary>
/// <param name="context"></param>
/// <param name="configuration"></param>
public KDSqlHelper(RBContext context)
{
_context = context;
}
private string Myconnstr(bool KD)
{
return KD ? ConnectionString.GetConfig("ConnectionStrings", "ERP_Conn") : ConnectionString.GetConfig("ConnectionStrings", "RBConn");
}
/// <inheritdoc/>
public async Task<string> ExecuteNonQueryAsync(string cmdText, CommandType cmdType, SqlParameter[]? sqlParams, bool KD = false)
{
string mess = null;
if (cmdText.Trim() == null) return "-1";
string connstr = Myconnstr(KD);
using SqlConnection connection = new SqlConnection(connstr);
try
{
connection.Open();
using var cmd = connection.CreateCommand();
//cmd.CommandTimeout = 0;
PrepareCommand(cmd, cmdType, cmdText, sqlParams);
cmd.Transaction = connection.BeginTransaction();
try
{
await cmd.ExecuteNonQueryAsync();
cmd.Transaction.Commit();
mess = "OK";
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
//将错误写到错误日志
mess = ex.Message;
LogHelper.WriteLog(string.Format("直接执行编译好的SQL语句的ExecuteNonQueryAsync方法发生错误在{0}", mess + "\n" + cmdText));
//throw;
}
finally
{
cmd.Dispose();
}
}
catch (Exception ex)
{
//将错误写到错误日志,连不上数据库,只能写在磁盘文件中...
mess = ex.Message;
LogHelper.WriteLog(string.Format("直接执行编译好的SQL语句的ExecuteNonQueryAsync方法发生错误{0}", mess));
}
finally
{
connection.Dispose();
}
return mess;
//throw new NotImplementedException();
}
/// <inheritdoc/>
public object? ExecuteScalar(CommandType cmdType, string cmdText, SqlParameter[]? sqlParams, ref string? mess, bool KD = false)
{
mess = null;
object? result = null;
if (string.IsNullOrEmpty(cmdText.Trim())) return null;
string connstr = Myconnstr(KD);
using SqlConnection connection = new SqlConnection(connstr);
try
{
connection.Open();
using var cmd = connection.CreateCommand();
//cmd.CommandTimeout = 0;
PrepareCommand(cmd, cmdType, cmdText, sqlParams);
//cmd.Transaction = connection.BeginTransaction();
try
{
result = cmd.ExecuteScalar();
//cmd.Transaction.Commit();
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
//将错误写到错误日志
mess = ex.Message;
LogHelper.WriteLog(string.Format("并返回由查询返回的结果集中第一行的第一列的ExecuteScalar方法发生错误在{0}", ex.Message + "\n" + cmdText));
}
finally
{
cmd.Dispose();
}
}
catch (Exception ex)
{
//将错误写到错误日志,连不上数据库,只能写在磁盘文件中...
mess = ex.Message;
LogHelper.WriteLog(string.Format("并返回由查询返回的结果集中第一行的第一列的ExecuteScalar方法发生错误{0}", ex.Message));
}
finally
{
connection.Dispose();
}
//result = result is DBNull ? null : result;
return result;
//throw new NotImplementedException();
}
/// <inheritdoc/>
public DataSet? GetDataSet(CommandType cmdType, string? cmdText, SqlParameter[]? sqlParams, ref string? mess, bool KD = false)
{
mess = null;
if (cmdText == null || cmdText == "")
{
mess = "不执行空的查询脚本";
return null;
}
var data = new DataSet();
string connstr = Myconnstr(KD);
using SqlConnection connection = new SqlConnection(connstr);
try
{
connection.Open();
using var cmd = connection.CreateCommand();
//cmd.CommandTimeout = 0;
PrepareCommand(cmd, cmdType, cmdText, sqlParams);
cmd.Transaction = connection.BeginTransaction();
SqlDataAdapter adapter = new(cmd);
try
{
adapter.Fill(data);
cmd.Transaction.Commit();
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
//将错误写到错误日志
mess = ex.Message;
LogHelper.WriteLog(string.Format("获取多个结果集的GetDataSet方法发生错误在{0}", ex.Message + "\n" + cmdText));
}
finally
{
adapter.Dispose();
cmd.Dispose();
}
}
catch (Exception ex)
{
//将错误写到错误日志,连不上数据库,只能写在磁盘文件中...
mess = ex.Message;
LogHelper.WriteLog(string.Format("获取多个结果集的GetDataSet方法发生错误{0}", ex.Message));
}
finally
{
connection.Dispose();
}
return data;
//throw new NotImplementedException();
}
/// <inheritdoc/>
public Dictionary<object, object> GetProcedurePairs(string cmdText, SqlParameter[] sqlParams, ref string? mess, bool KD = false)
{
mess = null;
Dictionary<object, object> keyValues = new();
//检查是否包含返回参数,如果没有就不用执行了
if (sqlParams == null) return keyValues;
string connstr = Myconnstr(KD);
using SqlConnection connection = new SqlConnection(connstr);
try
{
connection.Open();
using var cmd = connection.CreateCommand();
//cmd.CommandTimeout = 0;
PrepareCommand(cmd, CommandType.StoredProcedure, cmdText, sqlParams);
cmd.Transaction = connection.BeginTransaction();
try
{
cmd.ExecuteNonQuery();
cmd.Transaction.Commit();
foreach (DbParameter param in sqlParams)
{
if (param.Direction == ParameterDirection.Output || param.Direction == ParameterDirection.ReturnValue)
{
if (param.Value != null)
{
keyValues.Add(param.ParameterName, param.Value);
}
}
}
}
catch (Exception ex)
{
cmd.Transaction.Rollback();
mess = ex.Message;
LogHelper.WriteLog(string.Format("执行存储过程并获得返回值的GetProcedurePairs方法发生错误在{0}", ex.Message + "\n" + cmdText));
}
finally
{
cmd.Dispose();
}
}
catch (Exception ex)
{
mess = ex.Message;
LogHelper.WriteLog(string.Format("执行存储过程并获得返回值的GetProcedurePairs方法发生错误{0}", ex.Message));
}
finally
{
connection.Dispose();
}
return keyValues;
//throw new NotImplementedException();
}
/// <summary>
/// 为查询类赋值
/// </summary>
/// <param name="cmd"></param>
/// <param name="cmdType"></param>
/// <param name="cmdText"></param>
/// <param name="cmdParms"></param>
private static void PrepareCommand(IDbCommand cmd, CommandType cmdType, string cmdText, SqlParameter[]? cmdParms)
{
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
foreach (DbParameter parm in cmdParms)
cmd.Parameters.Add(parm);
}
}
/// <inheritdoc/>
public bool InsertBill(DataTable idata, string TableName, ref string? reason, bool KD = false)
{
bool isok = false;
reason = null;
if (TableName == null || TableName == "")
{
reason += "未提供数据表的表名";
}
if (idata == null)
{
reason += "目标表不能为空";
}
if (idata!.Rows.Count == 0)
{
reason += "目标表中没有可导入数据";
}
if (!string.IsNullOrWhiteSpace(reason))
{
return isok;
}
string connstr = Myconnstr(KD);
using SqlConnection connection = new SqlConnection(connstr);
try
{
connection.Open();
using (SqlBulkCopy sqlBulk = new(connection))
{
sqlBulk.DestinationTableName = TableName;
foreach (DataColumn column in idata.Columns)
{
string NewEntryColunm = column.ColumnName;
sqlBulk.ColumnMappings.Add(NewEntryColunm, NewEntryColunm); //由于提前已经准备好单据了,这两个参数保持一致就行了
}
sqlBulk.BatchSize = idata.Rows.Count;
sqlBulk.WriteToServer(idata);
sqlBulk.Close();
}
isok = true;
}
catch (Exception ex)
{
reason = ex.Message;
LogHelper.WriteLog(string.Format("将整理好的表单批量导入数据库的InsertBill方法在WriteToServer处发生错误{0}", ex.Message));
}
finally
{
connection.Dispose();
}
return isok;
}
}
}