using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using Microsoft.IdentityModel.Tokens; using Volo.Abp.Application.Services; using Volo.Abp.EntityFrameworkCore; using WinIn.FasterZ.AgGridReport.EntityFrameworkCore; namespace WinIn.FasterZ.AgGridReport; public class ReportProcAppService : ApplicationService { private readonly IDbContextProvider _dbContextProvider; public ReportProcAppService(IDbContextProvider dbContextProvider) { _dbContextProvider = dbContextProvider; } public async Task ExecuteProcedureBySqlAsync(string procName, Dictionary dictParms) { var dbContext = await _dbContextProvider.GetDbContextAsync(); var sql = $"EXEC [dbo].[{procName}] "; foreach (var dictParm in dictParms) { sql += $" @{dictParm.Key} = "; var value = string.IsNullOrEmpty(dictParm.Value) ? "NULL" : "'" + dictParm.Value + "'"; sql += $" {value} ,"; } sql = sql.Remove(sql.Length - 1); //去掉最后的','逗号 using (var command = await CreateCommandAsync(sql, CommandType.Text)) { command.CommandTimeout = 6000; var resultStr = ""; await using (var dataReader = await command.ExecuteReaderAsync()) { var dataTable = new DataTable(); dataTable.Load(dataReader); // 提取DataTable中的数据到C#对象列表 var data = ConvertDataTableToList(dataTable); // 将C#对象列表序列化为JSON var jsonData = JsonSerializer.Serialize(data); resultStr = jsonData; } return resultStr; } } public async Task ExecuteProcedureByProcAsync(string procName, Dictionary dictParms) { var resultStr = ""; var dbContext = await _dbContextProvider.GetDbContextAsync(); var command = dbContext.Database.GetDbConnection().CreateCommand(); var existingTransaction = dbContext.Database.CurrentTransaction; command.CommandTimeout = 6000; command.CommandText = procName; command.CommandType = CommandType.StoredProcedure; command.Transaction = existingTransaction.GetDbTransaction(); foreach (var dictParm in dictParms) { var param = new SqlParameter($"@{dictParm.Key}",string.IsNullOrEmpty(dictParm.Value)? DBNull.Value : dictParm.Value); command.Parameters.Add(param); } await using (var dataReader = await command.ExecuteReaderAsync()) { var dataTable = new DataTable(); dataTable.Load(dataReader); // 提取DataTable中的数据到C#对象列表 var data = ConvertDataTableToList(dataTable); // 将C#对象列表序列化为JSON var jsonData = JsonSerializer.Serialize(data); resultStr = jsonData; } return resultStr; } #region 私有 private static List> ConvertDataTableToList(DataTable dataTable) { var data = new List>(); foreach (DataRow row in dataTable.Rows) { var rowData = new Dictionary(); foreach (DataColumn column in dataTable.Columns) { if (row[column]!=null&&!string.IsNullOrEmpty(row[column].ToString())) { rowData[column.ColumnName] = row[column]; } else { rowData[column.ColumnName] = string.Empty; } } data.Add(rowData); } return data; } private async Task CreateCommandAsync(string commandText, CommandType commandType, params SqlParameter[] parameters) { var dbContext = await _dbContextProvider.GetDbContextAsync(); var command = dbContext.Database.GetDbConnection().CreateCommand(); var existingTransaction = dbContext.Database.CurrentTransaction; command.CommandText = commandText; command.CommandType = commandType; command.Transaction = existingTransaction.GetDbTransaction(); foreach (var parameter in parameters) { command.Parameters.Add(parameter); } return command; } #endregion }