如何在开放式NULL
中检查MySqlDataReader
值?
以下不起作用;它始终击中else
:
if (rdr.GetString("timeOut") == null)
{
queryResult.Egresstime = "Logged in";
}
else
{
queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
只接受列号,而不是名称。
答案 0 :(得分:31)
var ordinal = rdr.GetOrdinal("timeOut");
if(rdr.IsDBNull(ordinal)) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString(ordinal);
}//if
或
if(Convert.IsDBNull(rdr["timeOut"])) {
queryResult.Egresstime = "Logged in";
} else {
queryResult.Egresstime = rdr.GetString("timeOut");
}//if
答案 1 :(得分:14)
if(rdr.GetString(“timeOut”)== DBNull.Value)
null
与DBNull
对不起,错误的回答,Sam B是对的。我把这误认为DataRow
。
SqlDataReader确实有强类型GetString()
并为此案例提供了IsDBNull(int column)
。
答案 2 :(得分:3)
您必须致电rdr.IsDBNull(column)
以确定该值是否为DbNull
。
答案 3 :(得分:1)
将null
更改为DBNull.Value
。
答案 4 :(得分:1)
你也可以这样做:
If (string.IsNullOrEmpty(rdr.GetString("timeOut"))
答案 5 :(得分:1)
您可以将从NULL字段检索的对象与DBNull.Value进行比较。
答案 6 :(得分:1)
这是我喜欢的人:
var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
例如(原始要求):
queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
答案 7 :(得分:0)
这是我创建的一种方法,用于读取DBNull
并返回default(T)
,以防万一:
private T GetNullable<T>(MySqlDataReader reader, int ordinal, Func<int, T> getValue)
{
if (reader.IsDBNull(ordinal))
{
return default(T);
}
return getValue(ordinal);
}
可以这样使用:
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);
}
将基于T
-方法的返回值解析通用类型reader.
。如果返回字符串,则在null
的情况下将收到DBNull
。如果它是int
,它将返回0
,依此类推。
注意:对于整数值,可能不希望获得0
,所以要小心。
答案 8 :(得分:0)
private T GetNullableValue<T>(MySqlDataReader rdr, string parameterName)
{
object value = rdr[parameterName];
if (value is DBNull)
return default;
return (T)value;
}
以及用法例如:
string message = GetNullableValue<string>(rdr, "Message");
bool flag = GetNullableValue<bool>(rdr, "Flag");
DateTime startTime = GetNullableValue<DateTime>(rdr, "StartTime");