53

He creado un procedimiento almacenado que toma un parámetro de tabla de valores 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. He intentado enlazar una lista vacía, lo que dio como resultado el errorEnlazando la lista vacía o el valor nulo al parámetro de tabla de valor en un procedimiento almacenado (.net)

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.

entonces trataron de obligar a un valor nulo (que pensé que era lo que el mensaje anterior quería llegar), pero que sólo dio como resultado un mensaje de error diferente

System.NotSupportedException: DBNull valor para el parámetro '@MainItemIdList ' no es apoyado. Los parámetros con valores de tabla no pueden ser DBNull.

Parece que no se puede declarar el parámetro con valores de tabla anulables 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?

Respuesta

78

El truco es: no pase 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.

+8

Nunca está de más agregar una nueva respuesta o mejorar una. La información sigue siendo relevante y alguien más la encontrará útil (¡ese es el objetivo de este sitio!). +1 –

+0

¿Alguna idea de cómo hacer esto si usa adaptadores de tablas antiguos? TableAdapter crea una función de proxy CLR con la misma firma que el SP, y espera un valor no nulo. Pasar nulo o DbNull.Value arroja un error. –

+0

Subir 1. Esto es exactamente lo que tenía que hacer, probado y funciona muy bien. –

2

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 la siguiente:

new SqlParameter("yourParameterName", SqlDbType.Structured) 
    { 
     Direction = ParameterDirection.Input, 
     TypeName = "yourUdtType", 
     Value = null 
    }; 

Esto pasará el parámetro como 'por defecto'.

0

Aparece el error al pasar un IEnumerable<int> vacío, pero funciona bien cuando paso un List<int> vacío en su lugar.

Cuestiones relacionadas