c# - IDataReader 和 "HasColumn",最佳方法?

标签 c# ado.net idatareader

我见过两种检查 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/

相关文章:

c# - 在两列 ListView 中拉伸(stretch)项目

c# - Word 2013 分屏问题

c# - [事实] 属性是什么?

.net - 无法删除 key 。要删除的键已被另一个并发 session 从索引中删除

c# - 与 SQL Server 的初始连接速度很慢。为什么?

c# - 从 DataReader 访问 DateTime 字段时出现 MySqlConversionException

c# sharepoint 如何使用其他 SPListItem 的字段值设置 SPListItem 的字段值?

c# - 从 C# 连接到 MemSQL

c# - 阅读 WebApi 的 IDataReader 的最佳方式

c# - 从 IDataReader 获取值的 Null 安全方法