c# .net sql-server ado.net dbnull

c# - Pasar DBNull.Value y Vaciar el valor del cuadro de texto a la base de datos



dbnull c# (3)

Esta pregunta ya tiene una respuesta aquí:

Tengo algunos cuadros de texto en mi página que pueden estar vacíos porque son opcionales y tengo este código DAL

parameters.Add(new SqlParameter("@FirstName", FirstName)); parameters.Add(new SqlParameter("@LastName", LastName)); parameters.Add(new SqlParameter("@DisplayName", DisplayName)); parameters.Add(new SqlParameter("@BirthDate", BirthDate)); parameters.Add(new SqlParameter("@Gender", Gender));

Cualquiera de esos campos puede estar vacío. El problema es que cuando están vacíos recibo el Procedure XXX requires @FirstName which was not supplied

Luego cambié mi código a

parameters.Add(new SqlParameter("@FirstName", String.IsNullOrEmpty(FirstName) ? DBNull.Value : (object)FirstName)); parameters.Add(new SqlParameter("@LastName", String.IsNullOrEmpty(LastName) ? DBNull.Value : (object) LastName)); parameters.Add(new SqlParameter("@DisplayName", String.IsNullOrEmpty(DisplayName) ? DBNull.Value : (object) DisplayName)); parameters.Add(new SqlParameter("@BirthDate", BirthDate.HasValue ? (object)BirthDate.Value : DBNull.Value)); parameters.Add(new SqlParameter("@Gender", String.IsNullOrEmpty(Gender) ? DBNull.Value : (object) Gender));

Pero esto me parece desordenado, especialmente el lanzamiento para object porque el enunciado ternario requiere que ambos valores sean del mismo tipo.

¿Por qué la cadena vacía o la cadena nula no son tratadas como NULL en la base de datos? Si tengo que convertir esto a DBNull.Value ¿hay una manera más limpia? Guardar el valor como cadena vacía en la base de datos podría haber ayudado, pero consultar para NULL en la base de datos también se volverá desordenado

Por favor, dé su consejo sobre prácticas comunes o algo parecido a eso.


Puede establecer los parámetros por defecto en el procedimiento almacenado, haciéndolos opcionales.

create procedure XXX ( @FirstName nvarchar(50) = null, @LastName nvarchar(50) = null, ... )


Un pequeño re-factoring podría hacer que el código sea menos complicado. Prueba esto

dbParams.Add(SetDBNullIfEmpty("@FirstName", FirstName)); dbParams.Add(SetDBNullIfEmpty("@LastName", LastName)); dbParams.Add(SetDBNullIfEmpty("@DisplayName", DisplayName)); dbParams.Add(SetDBNullIfEmpty("@BirthDate", BirthDate)); dbParams.Add(SetDBNullIfEmpty("@Gender", Gender)); private SqlParameter SetDBNullIfEmpty(string parmName, string parmValue) { return new SqlParameter(parmName, String.IsNullOrEmpty(parmValue) ? DBNull.Value : (object)parmValue)); }


Primero, hay 2 sobrecargas más prácticas:

command.Parameters.Add("@name").Value = value;

o

command.Parameters.AddWithValue("@name", value);

Personalmente utilizo el siguiente método de extensión:

public static object DbNullIfNull(this object obj) { return obj != null ? obj : DBNull.Value; } command.Parameters.AddWithValue("@name", value.DbNullIfNull());

o

public static object DbNullIfNullOrEmpty(this string str) { return !String.IsNullOrEmpty(str) ? str : (object)DBNull.Value; }