我已经看到了两种检查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可能不得不对每列执行表扫描,这可能会非常慢.
思考?
我想我对这个古老的宝石有一个合理的答案.
我会采用第一种方法,因为它更简单.如果要避免异常,可以缓存字段名称并在缓存上执行TryGet.
public DictionaryCacheFields(IDataReader reader) { var cache = new Dictionary (); for (int i = 0; i < reader.FieldCount; i++) { cache[reader.GetName(i)] = i; } return cache; }
这种方法的优点是它更简单,并为您提供更好的控制.另外,请注意,您可能希望查看不区分大小写或假名不敏感的比较,这会使事情变得有点棘手.