Come verificare la presenza di NULL nel MySqlDataReader in base al nome della colonna?
-
12-10-2019 - |
Domanda
Come posso controllare per un valore NULL
in un MySqlDataReader
aperta?
Di seguito non funziona; è sempre colpire il else
:
if (rdr.GetString("timeOut") == null)
{
queryResult.Egresstime = "Logged in";
}
else
{
queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
accetta solo un numero di colonna, non il nome.
Soluzione
var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString(ordinal);
}//if
o
if(Convert.IsDBNull(rdr["timeOut"])) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString("timeOut");
}//if
Altri suggerimenti
if (rdr.GetString ( "timeout") == DBNull.Value)
null
non è lo stesso di DBNull
Mi dispiace, risposta sbagliata, Sam B è giusto. Ho scambiato questo per roba DataRow
.
SqlDataReader ha fortemente tipizzato GetString()
e fornisce IsDBNull(int column)
per questo caso.
Devi chiamare rdr.IsDBNull(column)
per determinare se il valore è DbNull
.
È possibile confrontare l'oggetto che recuperare dal campo NULL con DBNull .Value .
Cambia null
a DBNull.Value
.
È anche possibile fare:
If (string.IsNullOrEmpty(rdr.GetString("timeOut"))
Ecco quello che mi piace:
var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
es (per il requisito originale):.
queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
Ecco un metodo che ho creato per leggere DBNull
e restituire un incassa default(T)
:
private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
{
if (reader.IsDBNull(ordinal))
{
return default(T);
}
return getValue(ordinal);
}
Può essere utilizzato in questo modo:
if (reader.Read())
{
account = new Account();
account.Id = reader.GetInt32(0);
account.Name = reader.GetString(1);
account.MailVerifiedAt = GetNullable(reader, 2, reader.GetDateTime);
account.MailToken = GetNullable(reader, 3, reader.GetString);
}
Il tipo T
generico sarà risolto sulla base del valore di ritorno del metodo reader.
-. Se si restituisce una stringa si riceverà una in caso di null
DBNull
. Se è un int
esso tornerà 0
, ecc.
. Nota: per i valori interi non potrebbe desiderare di ottenere una 0
quindi state attenti