我该如何检查 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)

nullDBNull

对不起,答案错误,Sam B是对的。我误以为 DataRow 东西。

SQLDATAREDER确实很强烈键入 GetString() 并提供 IsDBNull(int column) 对于这种情况。

你必须打电话 rdr.IsDBNull(column) 确定该值是否为 DbNull.

您可以将从空字段重试的对象与 dbnull.value.

改变 nullDBNull.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 所以要小心。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top