valores - validar si un objeto es null c#
C#ADO.NET: nulls y DbNull-¿hay sintaxis más eficiente? (6)
¡Ah, ja! ¡Encontré una solución aún más eficiente que la de @ Trebz!
datePrm.Value = nullableDate ?? (object)DBNull.Value;
Tengo un DateTime?
que estoy tratando de insertar en un campo usando un DbParameter
. Estoy creando el parámetro así:
DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";
Y luego quiero poner el valor de DateTime?
en el dataPrm.Value
mientras se cuenta null
s.
Al principio pensé que sería inteligente:
datePrm.Value = nullableDate ?? DBNull.Value;
pero eso falla con el error
Operador ''?? no se puede aplicar a operandos del tipo ''System.DateTime?'' y ''System.DBNull''
Así que supongo que eso solo funciona si el segundo argumento es una versión no nulable del primer argumento. Entonces, fui por:
datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
pero eso tampoco funciona:
El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''System.DateTime'' y ''System.DBNull''
¡Pero no quiero convertir entre esos tipos!
Hasta ahora, lo único que puedo hacer es trabajar:
if (nullableDate.HasValue)
datePrm.Value = nullableDate.Value;
else
datePrm.Value = DBNull.Value;
¿Es esa la única forma en que puedo escribir esto? ¿Hay alguna manera de obtener un trazador de líneas utilizando el operador ternario para trabajar?
Actualización: realmente no entiendo por qué el ?? la versión no funciona MSDN dice:
Los ?? el operador devuelve el operando de la izquierda si no es nulo, o bien devuelve el operando derecho.
Eso es exactamente lo que quiero!
Actualización2: Bueno, fue algo obvio al final:
datePrm.Value = nullableDate ?? (object)DBNull.Value;
Creo que el error en su segundo intento se debe a que nullableDate.Value y DBNull.Value son tipos diferentes y que el operador ternario necesita elegir un tipo para devolver en ambos casos. No tengo el entorno para probar esto, pero creo que esto debería funcionar para usted:
datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : (object)DBNull.Value;
Funcionaría si usaras
datePrm.Value = nullableDate.HasValue ? (object)nullableDate.Value : DBNull.Value;
La forma en que lo hago, es que tengo una clase de utilidad estática que simplemente pasa y verifico si el valor del parámetro es nulo, luego establezco el valor para hacer DBNull. Lo hago antes de llamar al Execute.
Si está usando C # 3.0, puede crear un método de extensión para hacer esto fácil:
public static class DBNullableExtensions
{
public static object ToDBValue<T>(this Nullable<T> value) where T:struct
{
return value.HasValue ? (object)value.Value : DBNull.Value;
}
}
class Program
{
static void Main(string[] args)
{
int? x = null;
Console.WriteLine( x.ToDBValue() == DBNull.Value );
}
}
Si está utilizando SQLServer, el espacio de nombres System.Data.SqlTypes
contiene algunas clases de utilidad que evitan la conversión de tipo molesto. Por ejemplo en lugar de esto:
var val = (object) "abc" ?? DBNull.Value;
puedes escribir esto:
var val = "abc" ?? SqlString.Null;