19

如何检查NULLopen 中的值MySqlDataReader

以下不起作用;它总是击中else

if (rdr.GetString("timeOut") == null)
{
    queryResult.Egresstime = "Logged in";
}
else
{
    queryResult.Egresstime = rdr.GetString("timeOut");
}

rdr.IsDbNull(int i)只接受列号,不接受名称。

4

9 回答 9

33
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
于 2011-01-19T19:39:22.793 回答
14

if(rdr.GetString("timeOut") == DBNull.Value)

null不一样DBNull

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

SqlDataReader 确实具有强类型GetString()并提供IsDBNull(int column)这种情况。

于 2011-01-19T19:20:42.483 回答
4

您必须调用rdr.IsDBNull(column)以确定该值是否为DbNull

于 2011-01-19T19:35:34.480 回答
2

您可以将从 NULL 字段检索的对象与DBNull.Value进行比较。

于 2013-01-11T10:40:11.953 回答
1

更改nullDBNull.Value

于 2011-01-19T19:21:48.983 回答
1

你也可以这样做:

If (string.IsNullOrEmpty(rdr.GetString("timeOut"))

于 2011-01-19T19:23:32.743 回答
1

这是我喜欢的一个:

var MyString = rdr["column"] is DBNull ? "It's null!" : rdr.GetString("column");

例如(对于原始要求):

queryResult.Egresstime = rdr["timeOut"] is DBNull ? "Logged in" : rdr.GetString("timeOut");
于 2013-11-25T21:14:22.863 回答
1
    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");
于 2021-03-14T13:44:04.837 回答
0

这是我创建的一个用于读取DBNull和返回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);
        }

它可以这样使用:

   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,等等。

注意:对于整数值,可能不需要得到 a0所以要小心。

于 2018-08-08T02:11:21.877 回答