我见过两种检查 IDataReader 中是否存在列的常用方法:
public bool HasColumn(IDataReader reader, string columnName)
{
try
{
reader.getOrdinal(columnName)
return true;
}
catch
{
return false;
}
}
或者:
public bool HasColumn(IDataReader reader, string columnName)
{
reader.GetSchemaTable()
.DefaultView.RowFilter = "ColumnName='" + columnName + "'";
return (reader.GetSchemaTable().DefaultView.Count > 0);
}
就我个人而言,我使用了第二种,因为我讨厌因此而使用异常。
但是,在大型数据集上,我认为 RowFilter 可能必须对每列进行一次表扫描,这可能非常慢。
想法?
最佳答案
我想我对这个古老的 gem 有一个合理的答案。
我会选择第一种方法,因为它更简单。如果您想避免异常,您可以缓存字段名称并在缓存上执行 TryGet。
public Dictionary<string,int> CacheFields(IDataReader reader)
{
var cache = new Dictionary<string,int>();
for (int i = 0; i < reader.FieldCount; i++)
{
cache[reader.GetName(i)] = i;
}
return cache;
}
这种方法的好处是它更简单并且可以更好地控制。另外,请注意,您可能想要查看不区分大小写或不区分假名的比较,这会使事情变得有点棘手。
关于c# - IDataReader 和 "HasColumn",最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429758/