Usar Dapper con procedimientos almacenados de Oracle que devuelven cursores

.net c# dapper oracle

Pregunta

¿Cómo se usará Dapper con procedimientos almacenados de Oracle que devuelven cursores?

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

Aquí, el DbType es System.Data.DbType que no tiene un miembro de Cursor. Intenté usar DbType.Object pero eso no funciona con OracleClient y OracleDataAcess.

¿Cuál sería una posible forma de usar OracleType u OracleDbType en su lugar?

Respuesta aceptada

Deberías implementar:

 public interface IDynamicParameters
 {
    void AddParameters(IDbCommand command, Identity identity);
 }

Luego, en la AddParameters llamada de AddParameters , lanzaría el IDbCommand a OracleCommand y agregaría los parámetros específicos de DB.


Respuesta popular

Gracias por la solución aquí. Logré lo mismo con un poco menos de código usando un simple decorador 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());
        }
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow