当datareader可能没有特定列时要检查什么?

时间:2009-10-16 14:53:38

标签: c# ado.net

我正在进行空检查,但在执行时我得到了范围异常的索引:

if(myReader["column1"] != null)
{

}

在某些情况下,该列不存在,为什么不进行空检查?

6 个答案:

答案 0 :(得分:2)

检查列是否存在

for(int i = 0; i < myReader.FieldCount; i++) 
    if (myReader.GetName(i) == "column1")
        return true;

答案 1 :(得分:2)

你想要这样的东西:

if (myReader.GetSchemaTable().Columns.Contains("ColumnName"))
{

}

答案 2 :(得分:1)

为什么您的查询会更改它返回的列?使用列名称引用列会引发异常,因为找不到与列名对应的列索引。如果我是你,我会捕获异常并相应地处理错误。

答案 3 :(得分:1)

您可以尝试GetSchemaTable()

答案 4 :(得分:0)

如果相同的查询根据内容返回不同的列,对我来说看起来不是一个非常好的设计。无论如何,你可以在可能不同的列上使用myReader.GetName(i)来检查你是否得到了正确的列。

答案 5 :(得分:0)

好的,DataReader会公开GetSchemaTable(),它会为您提供DataReader中的架构/列。

另一个替代方法是尝试从列中获取值并捕获生成的异常,如果该列不存在:

try
{
     object value = dataReader["ColumnName"];
     // Do something with the value...
}
catch(IndexOutOfRangeException e)
{
     // Column not there!
}

但是,我不建议这样做,因为抛出/捕获异常是一项昂贵的业务,应该真正保留在代码中发生例外的事情。

我认为最好的方法是使用GetSchemaTable()函数,但使用“自己动手”DoesColumnExist样式函数,如:

public bool DoesColumnExist(IDataReader reader, string columnName)
{
     reader.GetSchemaTable().DefaultView.RowFilter = "ColumnName= '"  + columnName +  "'";  
     return (reader.GetSchemaTable().DefaultView.Count > 0);
}