How to check for NULL in MySqlDataReader by the column's name?
How can I check for a NULL
value in an open MySqlDataReader
?开发者_运维百科
The following doesn't work; it's always hitting the else
:
if (rdr.GetString("timeOut") == null)
{
queryResult.Egresstime = "Logged in";
}
else
{
queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
only accepts a column number, not name.
var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString(ordinal);
}//if
or
if(Convert.IsDBNull(rdr["timeOut"])) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString("timeOut");
}//if
if(rdr.GetString("timeOut") == DBNull.Value)
null
is not the same as DBNull
I am sorry, wrong answer, Sam B is right. I mistook this for DataRow
stuff.
SqlDataReader does have strongly typed GetString()
and provides IsDBNull(int column)
for this case.
You must call rdr.IsDBNull(column)
to determine if the value is DbNull
.
You can compare the object that retrive from NULL field with DBNull.Value.
Change null
to DBNull.Value
.
You can also do:
If (string.IsNullOrEmpty(rdr.GetString("timeOut"))
Here's one I like:
var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
E.g. (for the original requirement):
queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
private T GetNullableValue<T>(MySqlDataReader rdr, string parameterName)
{
object value = rdr[parameterName];
if (value is DBNull)
return default;
return (T)value;
}
And the usage for example:
string message = GetNullableValue<string>(rdr, "Message");
bool flag = GetNullableValue<bool>(rdr, "Flag");
DateTime startTime = GetNullableValue<DateTime>(rdr, "StartTime");
Here is a method that I created to read DBNull
and return a default(T)
incase:
private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
{
if (reader.IsDBNull(ordinal))
{
return default(T);
}
return getValue(ordinal);
}
It can be used like this:
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);
}
The generic type T
will be resolved based on the return value of the reader.
- method. If it returns a string you will receive a null
incase of DBNull
. If it is an int
it will return 0
, etc.
Note: for integer values it might not be desired to get a 0
so be careful.
精彩评论