c# .net null-coalescing-operator

dbnull c#



Posible utilizar ??(el operador coalesce) con DBNull? (6)

Si tengo un código similar al siguiente:

while(myDataReader.Read()) { myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0); }

Se arroja el error:

El objeto no se puede convertir de DBNull a otros tipos.

definir intVal como un int anulable no es una opción. ¿Hay alguna manera de hacer lo anterior?


¿Por qué no usar algo que no sea el operador de DBNull.Value null ( DBNull.Value ! = DBNull.Value ):

int i = myDataReader["mycolumn"] == DBNull.Value ? Convert.ToInt32(myDataReader["mycolumn"]) : 0;

Siempre puedes envolverlo en un método de extensión ordenado:

public static T Read<T>(this DataReader reader, string column, T defaultVal) { if(reader[column] == DBNull.Value) return defaultVal; return Convert.ChangeType(reader[column], typeof(T)); }


¿Puedes simplemente usar Int32.Tryparse ?

int number; bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);

Según el MSDN , el number contendrá 0 si la conversión falló


¿Qué tal algo como:

object x = DBNull.Value; int y = (x as Int32?).GetValueOrDefault(); //This will be 0

O en tu caso:

int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();


¿Se puede utilizar un método de extensión? (Escrito de la parte superior de mi cabeza)

public static class DataReaderExtensions { public static T Read<T>(this SqlDataReader reader, string column, T defaultValue = default(T)) { var value = reader[column]; return (T)((DBNull.Value.Equals(value)) ? defaultValue : Convert.ChangeType(value, typeof(T))); } }

Lo usarías como:

while(myDataReader.Read()) { int i = myDataReader.Read<int>("mycolumn", 0); }


Aquí hay una opción más:

while (myDataReader.Read()) { myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0); }


No, solo funciona para nulos.

¿Qué tal un método de extensión en un objeto que verifique DBNull y, en cambio, devuelva un valor predeterminado?

//may not compile or be syntactically correct! Just the general idea. public static object DefaultIfDBNull( this object TheObject, object DefaultValue ) { if( TheObject is DBNull ) return DefaultValue; return TheObject; }