.net - tipo - table value parameters
Enlazar la lista vacía o el valor nulo con el parámetro valorado de tabla en un procedimiento almacenado(.net) (3)
He creado un procedimiento almacenado que toma un parámetro valuado de tabla que es una tabla con una sola columna de tipo int. La idea es simplemente pasar una lista de identificadores al procedimiento de almacenamiento y permitir que sp funcione con los datos. Sin embargo, en el caso de que no haya datos para pasar, encuentro problemas (las cosas funcionan correctamente cuando tengo datos). Estoy convirtiendo una Lista en un IEnumerable, y vinculando eso al parámetro valuado de la tabla para el sp. Intenté vincular una lista vacía, lo que dio como resultado el error
System.ArgumentException: no hay registros en la enumeración SqlDataRecord. Para enviar un parámetro con valores de tabla sin filas, use una referencia nula para el valor en su lugar.
Luego intenté vincular un valor nulo (que pensé que era lo que estaba recibiendo el mensaje anterior), pero eso solo dio como resultado un mensaje de error diferente
System.NotSupportedException: el valor DBNull para el parámetro ''@MainItemIdList'' no es compatible. Los parámetros con valores de tabla no pueden ser DBNull.
No parece que pueda declarar el parámetro de tabla valorado como nulable en la declaración sp. ¿Cuál es el método correcto para vincular una lista vacía en un parámetro valorado en la tabla?
El truco es: no pasar el parámetro en absoluto . El valor predeterminado para un parámetro con valores de tabla es una tabla vacía.
Es una pena que el mensaje de excepción sea tan inútil.
Estaba un poco confundido por lo que significa la declaración ''no pasando el parámetro''. Lo que termina trabajando para Entity Framework ExecuteSqlCommandAsync () es este:
new SqlParameter("yourParameterName", SqlDbType.Structured)
{
Direction = ParameterDirection.Input,
TypeName = "yourUdtType",
Value = null
};
Esto pasará el parámetro como ''predeterminado''.
IEnumerable<int>
el error al pasar un IEnumerable<int>
vacío, pero funciona bien cuando paso una List<int>
vacía List<int>
lugar.