Dapper QueryMultipleAsync 未在 ASP.NET Core Web API 中返回任何结果(输出参数)

Dapper QueryMultipleAsync is not returning any result(output parameters) in ASP.NET Core Web API

提问人:Shivdutt 提问时间:11/11/2023 最后编辑:marc_sShivdutt 更新时间:11/11/2023 访问量:35

问:

我正在尝试执行一个返回 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);
        }
    }
}
C# Oracle Stored-Procedures ASP.net-Core-WebAPI dapper

评论

0赞 Yong Shun 11/12/2023
对于提到的错误,您收到该错误的哪一行?
0赞 Yong Shun 11/12/2023
您是否尝试过使用以下值读取值: ?oOutParamOnevar oParamOne = await result.ReadFirstOrDefaultAsync<string>();
0赞 Shivdutt 11/16/2023
读取 oPramaOne 的行。是的,我也尝试过这种方法,但没有奏效。不确定我是否遗漏了什么。请注意,我最近开始学习 .NET Core。如果我在这里犯了非常基本的错误,请原谅我

答: 暂无答案