我正在进行空检查,但在执行时我得到了范围异常的索引:
if(myReader["column1"] != null)
{
}
在某些情况下,该列不存在,为什么不进行空检查?
答案 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);
}