Parámetro de valor de tabla con procedimientos almacenados Dapper

c# dapper sql-server-2008

Pregunta

Estoy intentando llamar a un procedimiento almacenado que acepta un parámetro valorado en la tabla.

Estoy siguiendo las directrices sobre esta cuestión, implementando un tipo de parámetro personalizado:

internal class IntDynamicParam
{
    string name;
    IEnumerable<int> numbers;

    public IntDynamicParam(string name,IEnumerable<int> numbers)
    {
        this.name = name;
        this.numbers = numbers;
    }

    public void AddParameters(IDbCommand command)
    {
        var sqlCommand = (SqlCommand)command;
        sqlCommand.CommandType = CommandType.StoredProcedure;

        List<Microsoft.SqlServer.Server.SqlDataRecord> number_list = new List<Microsoft.SqlServer.Server.SqlDataRecord>();

        // Create an SqlMetaData object that describes our table type.
        Microsoft.SqlServer.Server.SqlMetaData[] tvp_definition = { new Microsoft.SqlServer.Server.SqlMetaData("n", SqlDbType.Int) };

        foreach (int n in numbers)
        {
            // Create a new record, using the metadata array above.
            Microsoft.SqlServer.Server.SqlDataRecord rec = new Microsoft.SqlServer.Server.SqlDataRecord(tvp_definition);
            rec.SetInt32(0, n);    // Set the value.
            number_list.Add(rec);      // Add it to the list.
        }

        // Add the table parameter.
        var p = sqlCommand.Parameters.Add("@" +name, SqlDbType.Structured);
        p.Direction = ParameterDirection.Input;
        p.TypeName = "int_list_type";
        p.Value = number_list;

    }
}

y estoy intentando usar esto de la siguiente manera:

var p = new DynamicParameters();
 p.AddDynamicParams(new IntDynamicParam("@IDList", new int[] { 1000, 2000, 3000 }));
 p.Add("@StartRow", startRow);
 p.Add("@EndRow", endRow);
 p.Add("@OrderByField", orderByField.ToString());
 p.Add("@OrderBy", orderBy.ToString());
 p.Add("@TotalRows", 0, dbType: DbType.Int32, direction: ParameterDirection.Output);
 var v = cnn.Query<venue>(spName, p,
                    commandType: CommandType.StoredProcedure).ToList<IDBVenueLite>();

Sin embargo, el parámetro ' @IDList ' no se pasa. Claramente AddDynamicParams no es el camino a seguir, ¿alguien puede ayudarme?

Respuesta aceptada

Históricamente, los parámetros con valores de tabla no han sido un gran foco en apuesto; principalmente porque solo funcionan en SqlConnection (dapper intenta atacar proveedores arbitrarios, incluidos proveedores ADO.NET "decorados", es decir, donde se esconde una SqlConnection debajo de un contenedor). Lo que podría hacer es implementar IDynamicParameters manualmente (o simplemente tomar prestada la clase DynamicParameters existente) para agregar esta funcionalidad:

void SqlMapper.IDynamicParameters.AddParameters(System.Data.IDbCommand command,
                                                SqlMapper.Identity identity)
{
    ...
    // and then whatever the code is...
    ((SqlCommand)command).Parameters
        .AddWithValue(...,...).SqlDbType = System.Data.SqlDbType.Structured;
    ...
}

También me esforzaré por hacer que la clase DynamicParameters concreta DynamicParameters más polimórfica aquí, de modo que en una compilación futura pueda override un solo método, detectar un tipo TVP-ish y agregar el parámetro manualmente.



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