58

我有一个数据读取器,它从 sql server 数据库返回一个 lsit 记录。我在数据库中有一个名为“附加”的字段。该字段有 50% 的时间为空或为空。

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

我试过了:

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

上面的代码给了我这个错误:

异常详细信息:System.IndexOutOfRangeException:附加

任何帮助将不胜感激...


也可以看看:

检查 SqlDataReader 对象中的列名

4

12 回答 12

81
if (myReader["Additional"] != DBNull.Value)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}
于 2009-04-18T04:18:14.730 回答
15
if (myReader.HasRows) //The key Word is **.HasRows**

{

    ltlAdditional.Text = "Contains data";

}

else

{   

    ltlAdditional.Text = "Is null Or Empty";

}
于 2013-08-23T08:11:18.537 回答
11

我已经 3 年多没有使用 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;
    }
}

凯文

于 2010-10-20T20:39:12.383 回答
9

这是正确且经过测试的解决方案

if (myReader.Read())
{

    ltlAdditional.Text = "Contains data";
}
else
{   
    ltlAdditional.Text = "Is null";
}
于 2011-03-08T23:54:42.137 回答
7

我也使用 OleDbDataReader.IsDBNull()

if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }
于 2011-11-27T17:58:40.417 回答
2

首先,您可能想要检查一个DBNullnot a regular Null

或者你可以看看IsDBNull方法

于 2009-04-18T04:12:45.027 回答
1

除了给出的建议之外,您还可以像这样直接从您的查询中执行此操作 -

SELECT ISNULL([Additional], -1) AS [Additional]

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

于 2009-04-18T04:22:15.580 回答
1

@乔菲利普斯

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

于 2010-06-25T22:27:05.947 回答
1

试试这个更简单的等效语法:

ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
于 2019-02-13T15:36:31.403 回答
0

我也遇到过这种问题,但我的,我使用 DbDataReader 作为我的通用阅读器(用于 SQL、Oracle、OleDb 等)。如果使用 DataTable,DataTable 有这个方法:

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

使用它我可以确定该列是否存在于我的查询具有的结果集中。我也在寻找 DbDataReader 是否具有此功能。

于 2011-10-16T03:01:33.417 回答
0

例子:

objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";
于 2018-02-02T13:05:28.753 回答
-1

AMG - 对不起,有一个金发碧眼的时刻。在我最初设计数据库之后,将“附加”字段添加到数据库中。

我更新了所有代码以使用这个新字段,但是我忘记更新调用选择数据库字段的实际数据读取器代码,因此它没有调用“附加”

于 2009-04-18T04:35:34.563 回答