using System; using System.Collections.Generic; using System.Data; using System.Dynamic; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Oracle.ManagedDataAccess.Client; namespace gdbg.Services { public class OracleDbService { private readonly string _connectionString; public OracleDbService(IConfiguration configuration) { _connectionString = configuration.GetConnectionString("OracleDB"); } // 通用的获取数据方法(执行 SELECT 语句),不带参数 public async Task> GetAsync(string query, Func mapFunction) { return await GetAsync(query, mapFunction, null); // 调用带参数的重载方法 } // 通用的获取数据方法(执行 SELECT 语句),支持带参数 public async Task> GetAsync(string query, Func mapFunction, List parameters) { var results = new List(); using (var connection = new OracleConnection(_connectionString)) { await connection.OpenAsync(); using (var command = new OracleCommand(query, connection)) { // 添加参数到命令 if (parameters != null) { command.Parameters.AddRange(parameters.ToArray()); } using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { results.Add(mapFunction(reader)); } } } } return results; } // 执行存储过程并返回结果 public async Task<(List[] results, Dictionary outputParams)> ExecuteStoredProcedureAsync( string procedureName, OracleParameter[] parameters, params string[] cursorParamNames) { var results = new List[cursorParamNames.Length]; var outputParams = new Dictionary(); using (var connection = new OracleConnection(_connectionString)) { await connection.OpenAsync(); using (var command = new OracleCommand(procedureName, connection)) { command.CommandType = CommandType.StoredProcedure; // 添加所有输入参数 if (parameters != null) { command.Parameters.AddRange(parameters); } // 添加游标输出参数 for (int i = 0; i < cursorParamNames.Length; i++) { var cursorParam = new OracleParameter(cursorParamNames[i], OracleDbType.RefCursor) { Direction = ParameterDirection.Output }; command.Parameters.Add(cursorParam); } // 执行存储过程 await command.ExecuteNonQueryAsync(); // 读取每个游标输出 for (int i = 0; i < cursorParamNames.Length; i++) { using (var reader = command.Parameters[cursorParamNames[i]].Value as OracleDataReader) { var cursorResults = new List(); while (await reader.ReadAsync()) { dynamic expando = new ExpandoObject(); var expandoDict = (IDictionary)expando; for (int j = 0; j < reader.FieldCount; j++) { string columnName = reader.GetName(j); object columnValue = reader.IsDBNull(j) ? null : reader.GetValue(j); expandoDict[columnName] = columnValue; } cursorResults.Add(expando); } results[i] = cursorResults; } } // 获取输出参数的值 foreach (var param in parameters) { if (param.Direction == ParameterDirection.Output) { outputParams[param.ParameterName] = param.Value; } } } } return (results, outputParams); } // 执行存储过程的方法 public async Task ExecuteProcedureAsync(string procedureCall, List parameters) { using (var connection = new OracleConnection(_connectionString)) { await connection.OpenAsync(); using (var command = new OracleCommand(procedureCall, connection)) { command.CommandType = CommandType.Text; // 使用文本命令来调用存储过程 if (parameters != null) { command.Parameters.AddRange(parameters.ToArray()); } await command.ExecuteNonQueryAsync(); // 执行存储过程 } } } // 通用的插入数据方法(执行 INSERT 语句) public async Task InsertAsync(string query, List parameters) { return await ExecuteNonQueryAsync(query, parameters); } // 通用的更新数据方法(执行 UPDATE 语句) public async Task UpdateAsync(string query, List parameters) { return await ExecuteNonQueryAsync(query, parameters); } // 通用的删除数据方法(执行 DELETE 语句) public async Task DeleteAsync(string query, List parameters) { return await ExecuteNonQueryAsync(query, parameters); } // 执行非查询语句的方法(INSERT, UPDATE, DELETE) private async Task ExecuteNonQueryAsync(string query, List parameters) { using (var connection = new OracleConnection(_connectionString)) { await connection.OpenAsync(); using (var command = new OracleCommand(query, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters.ToArray()); } return await command.ExecuteNonQueryAsync(); } } } } }