valores usar tipos tipo tabla stored recorrer pasar parametros parametro linea funciones con como array .net dapper

.net - usar - tipos de funciones en sql server



¿Admite Dapper los parámetros con valores de tabla de SQL 2008? (4)

Sé que este ticket es VIEJO, muy antiguo, pero quería hacerle saber que he publicado el paquete Dapper.Microsoft.Sql, que admite TVP genéricos.

https://www.nuget.org/packages/Dapper.Microsoft.Sql/

Uso de muestra:

List<char> nums = this.connection.Query<char>( "get_ints", new TableValuedParameter<char>( "@ints", "int_list_Type", new[] { ''A'', ''B'', ''C'' })).ToList();

Se basa en las clases originales del proyecto de prueba Dapper.

¡Disfrutar!

¿Alguien sabe si es posible pasar datos de parámetros con valores de tabla a un procedimiento almacenado con Dapper?


Sí, los apoyamos, pero deberá codificar sus propios ayudantes.

Por ejemplo:

class IntDynamicParam : Dapper.SqlMapper.IDynamicParameters { IEnumerable<int> numbers; public IntDynamicParam(IEnumerable<int> numbers) { 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("@ints", SqlDbType.Structured); p.Direction = ParameterDirection.Input; p.TypeName = "int_list_type"; p.Value = number_list; } } // SQL Server specific test to demonstrate TVP public void TestTVP() { try { connection.Execute("CREATE TYPE int_list_type AS TABLE (n int NOT NULL PRIMARY KEY)"); connection.Execute("CREATE PROC get_ints @ints int_list_type READONLY AS select * from @ints"); var nums = connection.Query<int>("get_ints", new IntDynamicParam(new int[] { 1, 2, 3 })).ToList(); nums[0].IsEqualTo(1); nums[1].IsEqualTo(2); nums[2].IsEqualTo(3); nums.Count.IsEqualTo(3); connection.Execute("DROP PROC get_ints"); connection.Execute("DROP TYPE int_list_type"); } }

Asegúrese de probar adecuadamente el rendimiento para los parámetros de tabla valorados. Cuando probé esto para pasar las listas de int, fue significativamente más lento que pasar múltiples params.

No estoy totalmente en contra de tener algunos ayudantes específicos de SQL Server para dapper en el proyecto contrib, sin embargo, el dapper central evita agregar trucos específicos del proveedor cuando sea posible.


hoy no lo es. De hecho, investigamos los parámetros de tabla-valed para nuestra descarada implementación "in" ( where col in @values ), pero no estábamos muy impresionados por el rendimiento. Sin embargo, en el contexto de un SPROC tiene sentido.

Su mejor opción es registrar esto como un problema en el sitio del proyecto para que podamos rastrearlo / priorizarlo. Sin embargo, parece que algo será factible, probablemente similar a las opciones de DbString o DynamicParameters.

¿Pero hoy? No.


Ahora hay (n Dapper 1.26 y superior) soporte directo para parámetros con valores de tabla horneados en dapper. En el caso de los procedimientos almacenados, dado que el tipo de datos está integrado en la API sproc, todo lo que necesita hacer es proporcionar una DataTable :

var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable }, ...);

Para el texto de comando directo tiene otras dos opciones:

  • utilice un método auxiliar para indicarle el tipo de datos personalizado:

    var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable.AsTableValuedParameter("mytype") }, ...);

  • dígale a la tabla de datos qué tipo de datos personalizados usar:

    someTable.SetTypeName("mytype"); var data = connection.Query<SomeType>(..., new { id=123, name="abc", values = someTable }, ...);

Cualquiera de estos debería funcionar bien.