我有一个datareader,它从sql server数据库返回一个lsit记录。我在数据库中有一个名为“Additional”的字段。该字段占空时的50%或为空。
我正在尝试编写检查此字段是否为空的代码。这背后的逻辑是: 如果“附加”字段包含文本,则显示信息,否则隐藏字段。
我试过了:
if (myReader["Additional"] != null)
{
ltlAdditional.Text = "contains data";
}
else
{
ltlAdditional.Text = "is null";
}
上面的代码给了我这个错误:
异常详细信息: System.IndexOutOfRangeException:其他
非常感谢任何帮助......
答案 0 :(得分:66)
if (myReader["Additional"] != DBNull.Value)
{
ltlAdditional.Text = "contains data";
}
else
{
ltlAdditional.Text = "is null";
}
答案 1 :(得分:11)
if (myReader.HasRows) //The key Word is **.HasRows**
{
ltlAdditional.Text = "Contains data";
}
else
{
ltlAdditional.Text = "Is null Or Empty";
}
答案 2 :(得分:10)
我没有使用DataReader 3年以上,所以我想确认一下我的记忆并发现了这一点。无论如何,对于像我这样发帖的人,想要一个方法来使用列名而不是序号来测试IsDBNull,并且你正在使用VS 2008+(我认为是& .NET 3.5),你可以写一个扩展名方法,以便您可以传递列名:
public static class DataReaderExtensions
{
public static bool IsDBNull( this IDataReader dataReader, string columnName )
{
return dataReader[columnName] == DBNull.Value;
}
}
凯文
答案 3 :(得分:8)
这是正确且经过测试的解决方案
if (myReader.Read())
{
ltlAdditional.Text = "Contains data";
}
else
{
ltlAdditional.Text = "Is null";
}
答案 4 :(得分:5)
我也使用OleDbDataReader.IsDBNull()
if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }
答案 5 :(得分:2)
首先,您可能想要检查DBNull
而不是常规Null
。
或者您可以查看IsDBNull
方法
答案 6 :(得分:1)
除了给出的建议外,您还可以直接从您的查询中执行此操作 -
SELECT ISNULL([Additional], -1) AS [Additional]
这样你就可以编写条件来检查字段值是否为< 0或> = 0。
答案 7 :(得分:1)
@Joe Philllips
SQlDataReader.IsDBNull(int index)需要列的序号。有没有办法使用列名检查空值,而不是它的序号?
答案 8 :(得分:0)
我更新了所有代码以使用这个新字段,但是我忘了更新正在调用的实际datareader代码来选择数据库字段,因此它没有调用“Additional”
答案 9 :(得分:0)
我也遇到过这种问题,但我的,我正在使用DbDataReader作为我的通用阅读器(对于SQL,Oracle,OleDb等)。如果使用DataTable,DataTable有这个方法:
DataTable dt = new DataTable();
dt.Rows[0].Table.Columns.Contains("SampleColumn");
使用这个我可以确定该列是否存在于我的查询所具有的结果集中。我也在寻找DbDataReader是否具备此功能。
答案 10 :(得分:0)
此
示例:
objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";
答案 11 :(得分:0)
尝试使用这种更简单的等效语法:
ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";