Comprender SqlMapper.ICustomQueryParameter

c# dapper sql-server table-valued-parameters

Pregunta

¿Cuál es el punto del método DataTable.AsTableValuedParameter que devuelve un SqlMapper.ICustomQueryParameter al tener que pasar una datatable como TVP a DB usando Dapper?

Podría enviar TVP a DB como datos normales y ejecutar consultas sin problemas. No estoy seguro de qué realizar AsTableValuedParameter en él compra adicionalmente.

Por ejemplo, esto funciona:

int rowsAffected = await conn.ExecuteAsync(
    "MyProc",
    new
    {
        myVar = (DataTable)GetThatDataTable(),
    },
    commandType: CommandType.StoredProcedure);

Además, una pregunta adicional, ¿cuál es la necesidad de typeName parámetro opcional en AsTableValuedParameter método? Funciona bien sin eso también.

Respuesta aceptada

Funciona bien en su caso porque está utilizando un procedimiento almacenado; el tipo definido por el usuario debe provenir de algún lugar , y en el caso de los procedimientos almacenados: que en alguna parte puede ser el tipo de parámetro declarado.

Sin embargo, dapper también funciona con consultas ad-hoc CommandText . En ese caso, sin esta llamada: no hay nombre de tipo , y la llamada fallará. Es importante para mí que las características también CommandText uso de CommandText , ya que es un caso de uso muy común.

Si funciona bien para ti sin: haz eso!


Respuesta popular

Pasar un parámetro valorado en la tabla de SQL Server requiere un nombre de tipo, por lo que no es opcional. Tiene que venir de algún lado.

SqlMapper tiene un método de extensión que establece el nombre de tipo para una DataTable en sus DataTable ExtendedProperties . Si no especifica el nombre del tipo en el método AsTableValuedParameter , verifica ExtendedProperties para el nombre del tipo.

Por lo tanto, el nombre del tipo todavía se está especificando, pero no en el método que está buscando. Probablemente esté sucediendo en el método que crea y devuelve DataTable . Busque el uso del public static void SetTypeName(this DataTable table, string typeName) .

Fuente SqlMapper , línea 3672.

Eso es conveniente porque si un tipo de DataTable dado existe solo para pasarlo como un parámetro valorado de tabla, entonces tiene sentido que pueda asociarlo con el tipo de ese parámetro. Eso hace que sea más fácil identificar a qué esquema debe ajustarse la DataTable .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué