如何检查一个DataReader是否为空或为空白

61

我有一个数据读取器,从SQL Server数据库中返回记录列表。数据库中有一个名为“Additional”的字段。此字段50%的时间为空或null。

我正在尝试编写代码来检查该字段是否为空。其背后的逻辑是: 如果字段“Additional”包含文本,则显示信息,否则隐藏该字段。

我尝试过:

if (myReader["Additional"] != null)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}

以上的代码给了我以下错误:

异常详情:System.IndexOutOfRangeException: Additional

非常感谢任何帮助...


参见:

检查SqlDataReader对象中的列名

13个回答

84
if (myReader["Additional"] != DBNull.Value)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}

1
感谢您的回复,Robert。 我尝试了您建议的代码,但是它仍然给出了“System.IndexOutOfRangeException: Additional”的错误提示,因为在这种情况下,“Additional”为空。 - Jason
虽然这是一篇较旧的帖子,但在VB中,“If reader(“Additional”)<> System.DBNull.Value Then”这段代码会返回错误:“运算符'<> '未定义为类型'Object'和'System.DBNull'”。 - htm11h
在VB中,语法为"If Not reader("Additional") Is DBNull.Value Then"。 - George

16
if (myReader.HasRows) //The key Word is **.HasRows**

{

    ltlAdditional.Text = "Contains data";

}

else

{   

    ltlAdditional.Text = "Is null Or Empty";

}

谢谢,这对我很有帮助。但在Windows Phone 8.1中,应该是myReader.HasRows,不需要“()”。 - Icet
这回答了我的问题和标题中的问题,但原帖表明标题完全错误。很高兴有人能在这里找到答案。只是可惜它排得这么靠后... - Hans Goldman
我不确定这是否适用于此情况。除非查询无法执行,否则SqlReader始终至少有一行空数据集。 - Jesse Williams

11

我三年没用DataReaders了,所以我想确认一下我的记忆并找到了这个。 无论如何,对于任何像我一样偶然看到此帖子并想要使用列名称而不是序数号测试IsDBNull的人,并且您正在使用VS 2008+(以及.NET 3.5,我想),您可以编写一个扩展方法,以便您可以传递列名:

public static class DataReaderExtensions
{
    public static bool IsDBNull( this IDataReader dataReader, string columnName )
    {
        return dataReader[columnName] == DBNull.Value;
    }
}

凯文


8

这是经过验证的正确解决方案。

if (myReader.Read())
{

    ltlAdditional.Text = "Contains data";
}
else
{   
    ltlAdditional.Text = "Is null";
}

2
如果特定列中的值是 NULL,会发生什么? - shashwat
调用 .Read() 会读取第一行,所以如果将 DataReader 传递到带有 while(DataReader.Read()) 的方法/函数中,那么第一行是否会被跳过? 如果是的话,我们可以使用 do while。 - Ernest
这只会测试DataReader是否有行。问题是如何测试特定字段中的NULL值。IDataReader文档:https://msdn.microsoft.com/zh-cn/library/system.data.idatareader.read(v=vs.110).aspx - Brian Merrell

8

我也使用OleDbDataReader.IsDBNull()。

if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }

简写:retrievedValue = myReader.IsDBNull(colNum) ? string.Empty : myReader.GetString(colNum); 请注意,colNum 可以替换为 colName。 - clamchoda

3

首先,您可能需要检查 DBNull 而不是常规的 Null

或者您可以查看 IsDBNull 方法。


在这个数据库表中有15行。其中14行返回数据,但第15行(“Additional”)并不总是包含数据。如果使用有效行,.HasRows会如何工作? - Jason

1
除了已经给出的建议外,您可以直接从查询中执行此操作,如下所示 -
SELECT ISNULL([Additional], -1) AS [Additional]

这样,您就可以编写条件来检查字段值是<0还是>= 0。


我通常遵循这种模式,因为在数据库中NULL代表着什么都没有。 - Saif Khan

1

@Joe Philllips

SQlDataReader.IsDBNull(int index)需要列的序号。有没有一种方法可以使用列名而不是它的序号来检查空值?


我想如果我想使用列名而不是序号,我可以使用以下代码:if (readerObject["ColumnName"] != DBNull.Value)虽然我不确定这种方法和IsDBNull(columnOrdinalNumber)方法之间是否存在性能提升或降低。-Shiva http://mycodetrip.com/ - Shiva

1
尝试使用这个更简单的等效语法:

ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";

0

我也遇到了这种问题,但我的解决方法是使用DbDataReader作为通用读取器(适用于SQL、Oracle、OleDb等)。如果使用DataTable,则DataTable有此方法:

DataTable dt = new DataTable();
dt.Rows[0].Table.Columns.Contains("SampleColumn");

使用这个方法,我可以确定查询结果集中是否存在该列。我还在寻找DbDataReader是否具有此功能。


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