繁体   English   中英

使用ToList后出现“行/列没有数据”异常

[英]“No data exists for the row/column” exception after using ToList

我有一个扩展方法将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的结果复制到一个列表中,以便可以多次枚举它们。

var temp = records.ToList();

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

InvalidOperationException:行/列中没有数据

我在这里想念什么?

您的枚举不包含不同的对象,但是所有枚举都返回相同的实例(您的阅读器)。 基本上,您正在执行以下操作:

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

循环结束后,reader将不包含任何内容,而如果您查看列表中的任何“项目”,则将获得任何内容。 如果您尝试在倒数第二个项目处停止,那么您还会看到它们都包含相同的值。

它不包含列表的原因是因为您正在执行以下操作:

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

}

如果您有读者,但需要数据集,请加载数据集...

如果您有数据集,但是想要一个可查询的集合,请使用数据集扩展名

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM