verificar valores valor validar tener sea que objeto nulo net debe comprobar campo acepta c# ado.net null nullable dbnull

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;