如何通过列名在MySqlDataReader中检查NULL值?

20

如何在打开的MySqlDataReader中检查NULL值?

以下代码不起作用:它总是进入了else分支:

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

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

9个回答

34
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

你是自己绿色勾号的获胜者。我用了第二个。谢谢! - rd42
第二个例子中有一个小错别字:将“IsDbNull”更改为“IsDBNull”。 - 4mla1fn
这个空值检查太长了,简直疯了。 - ed22

14

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

nullDBNull是不同的。

对不起,答案错误。Sam B是正确的。我搞错了,这是关于DataRow的东西。

SqlDataReader确实有强类型的GetString()方法,并提供IsDBNull(int column)来处理这种情况。


2
我认为应该是 DBNull.Value - VoodooChild
这是我得到的错误1:无法将“==”运算符应用于类型为“string”和“System.DBNull”的操作数。 - rd42

4

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


2

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


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");

1

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");

1

null更改为DBNull.Value


这是我收到的错误信息1:无法将“==”运算符应用于类型为“string”和“System.DBNull”的操作数。 - rd42

1

你也可以这样做:

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


与(rdr.GetString("timeOut") == null)具有相同的效果。 - rd42
1
@rd42:那么当您进行调试时,该字段的实际值是多少?只是好奇? - VoodooChild
值为:12/7/2010 10:16:46 AM。感谢您的帮助。 - rd42

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.方法的返回值进行解析。如果它返回一个字符串,那么在DBNull的情况下你将会收到一个null。如果它是一个int,它将返回0等。

注意:对于整数值,可能不希望得到一个0,所以要小心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接