如何在打开的MySqlDataReader
中检查NULL
值?
以下代码不起作用:它总是进入了else
分支:
if (rdr.GetString("timeOut") == null)
{
queryResult.Egresstime = "Logged in";
}
else
{
queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
只接受列编号,而不是列名称。
如何在打开的MySqlDataReader
中检查NULL
值?
以下代码不起作用:它总是进入了else
分支:
if (rdr.GetString("timeOut") == null)
{
queryResult.Egresstime = "Logged in";
}
else
{
queryResult.Egresstime = rdr.GetString("timeOut");
}
rdr.IsDbNull(int i)
只接受列编号,而不是列名称。
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
if(rdr.GetString("timeOut") == DBNull.Value)
null
与DBNull
是不同的。
对不起,答案错误。Sam B是正确的。我搞错了,这是关于DataRow
的东西。
SqlDataReader确实有强类型的GetString()
方法,并提供IsDBNull(int column)
来处理这种情况。
DBNull.Value
。 - VoodooChild您必须调用 rdr.IsDBNull(column)
来确定该值是否为 DbNull
。
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");
Here's one I like:
var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
例如:(对于原始需求)
queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
将null
更改为DBNull.Value
。
你也可以这样做:
If (string.IsNullOrEmpty(rdr.GetString("timeOut"))
这是我创建的一个方法,用于读取 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.
方法的返回值进行解析。如果它返回一个字符串,那么在DBNull
的情况下你将会收到一个null
。如果它是一个int
,它将返回0
等。
注意:对于整数值,可能不希望得到一个0
,所以要小心。