【问题标题】:"No data exists for the row/column" exception after using ToList使用 ToList 后出现“行/列不存在数据”异常
【发布时间】:2010-12-03 14:58:01
【问题描述】:

我有一个将 DbDataReader 转换为 IEnumerable 对象的扩展方法:

public static IEnumerable<IDataRecord> AsEnumerable(this DbDataReader reader) {
    while (reader.Read()) {
        yield return reader;
    }
}

在我的应用程序中,我像这样查询数据库:

var records = context.Query("select WRKORDNBR from WRKORDER").AsEnumerable();

然后,我枚举每条记录并获取 WRKORDNBR 字段的值:

foreach (var record in records) {
    DoSomething((int)record["WRKORDNBR"]);
}

这之前工作得很好。现在,我费心转换 DbDataReader 的原因是因为我需要在 foreach 块之前对记录执行 LINQ 查询。如您所知,DbDataReader 中的记录只能枚举一次(或者我完全遗漏了什么)?这意味着我必须将 AsEnumerable 的结果复制到一个 List 中,以便我可以多次枚举它们。

var temp = records.ToList();

至少,我认为这是我必须做的。但是当我更改我的 foreach 循环以遍历临时集合时,我得到:

InvalidOperationException:行/列不存在数据

我在这里错过了什么?

【问题讨论】:

    标签: c# .net linq ienumerable dbdatareader


    【解决方案1】:

    如果你有读者,但你想要一个数据集,load 数据集...

    如果您有数据集,但想要一个可查询的集合,请使用dataset extensions

    【讨论】:

      【解决方案2】:

      您的枚举不包含不同的对象,但所有枚举都返回相同的实例(您的读者)。你基本上是在做以下事情:

      var list = new List<IDataRecord>();
      while (reader.Read()) 
      {
          list.Add(reader);
      }
      

      一旦循环结束,reader 将不包含任何内容,如果您查看列表中的任何“项目”,就会得到这样的结果。如果您尝试停在倒数第二项,您还会看到它们都包含相同的值。

      它在没有列表的情况下工作的原因是因为你正在做一些事情:

      while (reader.Read()) 
      {
          DoSomething((int)record["WRKORDNBR"]);
      
      }
      

      【讨论】:

      • 那么我将如何解决这个问题?我应该怎么做?我想要做的就是能够多次枚举 DbDataReader 的内容。
      • 那么你需要远离 DataReader,因为它只允许你枚举一次......我建议你放弃 DataReader 并切换到强类型,例如域模型,然后尽可能使用 ORM 或 Linq2Sql(当然不是数据集)。
      • 不幸的是,我不能将 ORM 或 Linq2Sql 与我必须与之交互的数据库系统一起使用。我想我已经决定枚举 DataReader 并在我自己的 ToList 扩展方法中构建一个 List> 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      • 2013-10-14
      • 2020-01-31
      • 1970-01-01
      相关资源
      最近更新 更多