提问人:Shivdutt 提问时间:11/11/2023 最后编辑:marc_sShivdutt 更新时间:11/11/2023 访问量:35
Dapper QueryMultipleAsync 未在 ASP.NET Core Web API 中返回任何结果(输出参数)
Dapper QueryMultipleAsync is not returning any result(output parameters) in ASP.NET Core Web API
问:
我正在尝试执行一个返回 2 个输出参数的 Oracle 存储过程:
PROCEDURE SP1 (
inputParamOne IN VARCHAR2,
inputParamSecond IN VARCHAR2,
oOutParamOne OUT VARCHAR2,
oOutParamsecond OUT SYS_REFCURSOR)
此过程工作正常。但是,当尝试在 ASP.NET Core Web API 中调用此存储过程时,它会引发错误
读者已被处置;这可能在使用所有数据后发生
using Project.Model;
using Dapper;
using Oracle.ManagedDataAccess.Client;
using System.Data;
namespace Project.Services
{
public class SampleService : ISampleService
{
private readonly IDatabaseService _databaseService;
private readonly ILogger<SampleService> _logger;
public SampleService(ILogger<SampleService> logger, IDatabaseService databaseService)
{
_databaseService = databaseService;
_logger = logger;
}
public async Task<(string param1, CallStatus? callStatus)> FirstMethod(InputParametes inputParametes)
{
try
{
_logger.LogInformation("SampleService: Open New DB Connection");
using var connection = _databaseService.GetConnection();
if (connection.State != ConnectionState.Open)
{
_logger.LogError("SampleService: Database connection is not open");
return (null, null);
}
var parameters = new OracleDynamicParameters();
//Input Parameters
_logger.LogInformation("SampleService: Add Input Parameters");
parameters.Add("inputParamOne", OracleDbType.Char, ParameterDirection.Input, inputParametes.inputOne);
parameters.Add("inputParamSecond", OracleDbType.Char, ParameterDirection.Input, inputParametes.inputSecond);
_logger.LogInformation("SampleService: Add Output Parameters");
parameters.Add("oOutParamOne", oracleDbType: Oracle.ManagedDataAccess.Client.OracleDbType.Char, ParameterDirection.Output);
parameters.Add("oOutParamsecond", oracleDbType: Oracle.ManagedDataAccess.Client.OracleDbType.RefCursor, ParameterDirection.Output);
_logger.LogInformation("SampleService: Execute DB Stored Procedure");
var result = await connection.QueryMultipleAsync("SP1", parameters, commandType: CommandType.StoredProcedure);
_logger.LogInformation("SampleService: read output parameters");
var oParamOne = parameters.Get<string>("oOutParamOne");
var callStatus = await result.ReadFirstOrDefaultAsync<CallStatus>().ConfigureAwait(false);
_logger.LogInformation($"SampleService: oParamOne:{oParamOne}, Call status: {callStatus?.Status}, message: {callStatus?.Message}, ErrorID: {callStatus?.ErrorID}");
return (oParamOne, callStatus);
}
catch (Exception ex)
{
_logger.LogError(ex, $"SampleService: Error executing while communicating with DB. Error is {ex.Message}");
throw new Exception(ex.Message);
}
}
}
}
这是类:OracleDynamicParameters
using Dapper;
using Oracle.ManagedDataAccess.Client;
using System.Data;
using System.Security.Policy;
namespace CrewVerify.Services
{
public class OracleDynamicParameters : SqlMapper.IDynamicParameters
{
private readonly DynamicParameters dynamicParameters = new DynamicParameters();
private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();
public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null)
{
var oracleParameter = new OracleParameter(name, oracleDbType, value, direction);
if (size.HasValue)
{
oracleParameter.Size = size.Value;
}
oracleParameters.Add(oracleParameter);
}
public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction)
{
var oracleParameter = new OracleParameter(name, oracleDbType, direction);
oracleParameters.Add(oracleParameter);
}
public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
{
((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity);
var oracleCommand = command as OracleCommand;
if (oracleCommand != null)
{
oracleCommand.Parameters.AddRange(oracleParameters.ToArray());
}
}
public T Get<T>(string name)
{
return dynamicParameters.Get<T>(name);
}
public IEnumerable<string> GetParameterNames()
{
return oracleParameters.Select(p => p.ParameterName);
}
}
}
答: 暂无答案
评论
oOutParamOne
var oParamOne = await result.ReadFirstOrDefaultAsync<string>();