将Dapper与Oracle存储过程一起使用,返回游标

har*_*ark 16 .net c# oracle dapper

如何将Dapper与返回游标的Oracle存储过程一起使用?

var p = new DynamicParameters();
p.Add("foo", "bar");
p.Add("baz_cursor", dbType: DbType.? , direction: ParameterDirection.Output);
Run Code Online (Sandbox Code Playgroud)

这里,DbType是System.Data.DbType,它没有Cursor成员.我尝试过使用DbType.Object,但这对OracleClient和OracleDataAcess都不起作用.

相反,使用OracleType或OracleDbType的可能方法是什么?

Dan*_*ith 9

谢谢你的解决方案.我使用一个简单的DynamicParameter装饰器以更少的代码实现了同样的目的:

public class OracleDynamicParameters : SqlMapper.IDynamicParameters
{
    private readonly DynamicParameters dynamicParameters = new DynamicParameters();

    private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();

    public void Add(string name, object value = null, DbType? dbType = null, ParameterDirection? direction = null, int? size = null)
    {
        dynamicParameters.Add(name, value, dbType, direction, size);
    }

    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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*ron 7

你必须实现:

 public interface IDynamicParameters
 {
    void AddParameters(IDbCommand command, Identity identity);
 }
Run Code Online (Sandbox Code Playgroud)

然后在AddParameters回调中,您将IDbCommand转换为OracleCommand并添加DB特定的参数.


Nim*_*tri 5

此类添加到您的项目中

并且您的代码应该如下所示:-

        var p = new OracleDynamicParameters();
        p.Add("param1", pAuditType);
        p.Add("param2", pCommnId);
        p.Add("outCursor", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);

        using (var multi = cnn.QueryMultiple("procedure_name", param: p, commandType: CommandType.StoredProcedure))
        {
            var data = multi.Read();
            return data;
        }
Run Code Online (Sandbox Code Playgroud)

  • 链接已损坏。 (2认同)