如何通过列的名称在mysqldatareader中检查null?
-
12-10-2019 - |
题
我该如何检查 NULL
公开的价值 MySqlDataReader
?
以下是行不通的;它总是击中 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
东西。
SQLDATAREDER确实很强烈键入 GetString()
并提供 IsDBNull(int column)
对于这种情况。
你必须打电话 rdr.IsDBNull(column)
确定该值是否为 DbNull
.
您可以将从空字段重试的对象与 dbnull.value.
改变 null
至 DBNull.Value
.
您也可以做:
If (string.IsNullOrEmpty(rdr.GetString("timeOut"))
我喜欢这一个:
var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");
例如 (对于原始要求):
queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : 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.
- 方法。如果返回字符串,您将收到一个 null
的情况下 DBNull
. 。如果是 int
它将返回 0
, , ETC。
注意:对于整数值,可能不希望获得一个 0
所以要小心。
不隶属于 StackOverflow