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;
}