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