You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
3.9 KiB

1 year ago
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<AgGridReportDbContext> _dbContextProvider;
public ReportProcAppService(IDbContextProvider<AgGridReportDbContext> dbContextProvider)
{
_dbContextProvider = dbContextProvider;
}
public async Task<string> ExecuteProcedureBySqlAsync(string procName, Dictionary<string, string> 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<string> ExecuteProcedureByProcAsync(string procName, Dictionary<string, string> 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<Dictionary<string, object>> ConvertDataTableToList(DataTable dataTable)
{
var data = new List<Dictionary<string, object>>();
foreach (DataRow row in dataTable.Rows)
{
var rowData = new Dictionary<string, object>();
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<DbCommand> 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
}