Possibile usare ??(L'operatore di coalese) con Dbnull?
-
12-11-2019 - |
Domanda
Se ho il codice simile al seguente:
while(myDataReader.Read())
{
myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}
.
Getta l'errore:
.L'oggetto non può essere lanciato da Dbnull ad altri tipi.
Definizione
intVal
come un int nullable non è un'opzione.C'è un modo per me di fare quanto sopra?
Soluzione
puoi usare un metodo di estensione?(scritto dalla parte superiore della mia testa)
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 useresti come:
while(myDataReader.Read())
{
int i = myDataReader.Read<int>("mycolumn", 0);
}
. Altri suggerimenti
Ecco un'altra opzione:
while (myDataReader.Read())
{
myObject.intVal = (myDataReader["mycolumn"] as int? ?? 0);
}
. Puoi semplicemente usare Int32.Tryparse
?
int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);
.
Secondo msdn , number
conterrà 0 se la conversione fallita
Che ne dici di qualcosa come:
object x = DBNull.Value;
int y = (x as Int32?).GetValueOrDefault(); //This will be 0
.
o nel tuo caso:
int i = (myDataReader["mycolumn"] as Int32?).GetValueOrDefault();
. Perché non usare qualcosa di diverso dall'operatore NULL Coalescing (DBNull.Value
!= null
):
int i = myDataReader["mycolumn"] == DBNull.Value ?
Convert.ToInt32(myDataReader["mycolumn"]) :
0;
.
Potresti sempre avvolgerlo in un metodo di estensione ordinato:
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));
}
. No, funziona solo per NULLS.
Informazioni su un metodo di estensione sull'oggetto che controlla il dbnull e restituisce invece un valore predefinito?
//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;
}
.