¿Cómo puedo enviar una cadena como NULL a SQLServer usando Dapper?

c# dapper sql-server

Pregunta

Tengo un escenario donde una cadena en C # puede ser null . Necesito que sea NULL en SQLServer.

Lo estoy enviando a SQLServer usando Dapper con una consulta como:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: startDate
}, commandType: CommandType.StoredProcedure);

Donde startDate es la cadena que a veces puede ser null .

El parámetro del procedimiento almacenado es

@StartDate varchar(10) = NULL

Cuando es NULL , devuelve todos los registros. Confirmé que este comportamiento funciona a través de SSMS.

Leí esta publicación de Marc Gravell que dice:

El problema nulo vs DBNull es una causa constante de confusión; sin embargo, en general , si las personas dicen null en C #, intentan null en SQL. Este es el enfoque que dapper adopta.

Esto me lleva a creer que cuando la string se establece en null , debe enviar DBNull.Value a SQLServer.

Sin embargo, este no parece ser el caso. Obtengo 0 registros de SQLServer cuando envío una cadena null . Esto parece indicativo de enviar una cadena vacía, en lugar de un DBNull.Value .

Además, no puedo enviar DBNull.Value directamente:

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), new
{
    StartDate: DBNull.Value
}, commandType: CommandType.StoredProcedure);

Esto produce una excepción dentro de Dapper:

El miembro StartDate de tipo System.DBNull no se puede usar como un valor de parámetro

Pregunta

¿Cómo puedo enviar NULL a SQLServer, usando Dapper, cuando tengo una string en C # que puede ser null ?


Importante

Dapper efectivamente envía NULL cuando una cadena es null . Esta suposición fue un error de mi parte basado en información defectuosa. No obstante, esta pregunta puede servir para ayudar a alguien más que hace una suposición igualmente errónea.

Además, la respuesta aceptada proporciona un buen mecanismo para tratar con parámetros opcionales o condicionales.

Respuesta aceptada

Puede optar por no enviar StartDate.

Ejemplo:

dynamic parameters = new {

};

if (!string.IsNullOrWhiteSpace(startDate)) 
{
   parameters.StartDate = startDate;
}

connection.Query<MyObject>("[dbo].[sp_MyStoredProcedure]"), parameters, commandType: CommandType.StoredProcedure);

Editar:

Además, su procedimiento almacenado debe aceptar nulos. Aquí hay un ejemplo:

CREATE PROCEDURE [ExampleProc]
   @StartDate datetime = null
AS
   Select @StartDate

Respuesta experta

Sí, Dapper sabe reemplazar reference- null con DBNull.Value cada vez que lo ve. Porque DBNull es mi archienemigo, y si nunca vuelvo a verlo en el código de mi aplicación (el código de la biblioteca es diferente) moriré un poco más feliz.

Ver también: https://stackoverflow.com/a/9632050/23354



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