在查询结果上启动 foreach 循环时出现“不存在数据时尝试读取无效”

Posted

技术标签:

【中文标题】在查询结果上启动 foreach 循环时出现“不存在数据时尝试读取无效”【英文标题】:"Invalid attempt to read when no data is present" when starting a foreach loop on query result 【发布时间】:2012-05-23 17:35:02 【问题描述】:

我有这个问题:

 // _db derives from DbContext
 var toProcess = from jobItem in _db.Jobs
                 where jobItem.State == desiredState
                 select jobItem.ItemId;
 foreach (Guid itemId in toProcess ) //exception thrown on this line
 
     // whatever
 

大多数情况下运行良好,但偶尔会抛出foreach 的行:

System.InvalidOperationException:不存在数据时尝试读取无效

使用以下堆栈跟踪:

System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
System.Data.SqlClient.SqlDataReader.IsDBNull(Int32 i)
System.Data.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
System.Data.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling[TColumn](Int32 ordinal)
System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()

这没有任何意义。我该如何解决这个问题?

【问题讨论】:

这是一个非常奇怪的错误;看起来像是某种内部混乱检查行;这是使用什么版本的 .NET? @Marc Gravell:这是 4.0 版 什么版本的 EF? 4.0、4.1、4.2、4.3?你试过更新吗? 随机问题;是否有人在您的连接上发布了SET FMTONLY ONSET ROWCOUNT [n]?这看起来很奇怪,我只是想排除可能的原因 数据库中的 itemID 是否可以为空? 【参考方案1】:

根据您对我的评论的回复:

有一些中等重量的活动预计将在 几秒钟,但我想可能需要更长的时间。你认为超时 发生了什么?

我想这是超时或类似的事情。您可以增加超时时间,或者您可以强制它评估并将其存储在内存中以供以后处理。您可以通过在查询末尾添加ToArray() 来做到这一点:

 var toProcess = (from jobItem in _db.Jobs
                 where jobItem.State == desiredState
                 select jobItem.ItemId).ToArray();

看看有没有帮助。

【讨论】:

以上是关于在查询结果上启动 foreach 循环时出现“不存在数据时尝试读取无效”的主要内容,如果未能解决你的问题,请参考以下文章

在循环TimeoutError中启动多个select查询时出现错误:ResourceRequest超时

在 R 中使用 foreach 循环读取 MATLAB .mat 文件时出现问题

在 c:forEach 中渲染 h:panelGroup 时出现错误的 id

第一次 foreach 循环后 hTTPResponse.Content.ReadAsStringAsync().Result 上的空消息

PDO 查询未在 PHP foreach 循环中返回结果

尝试在 mysql 中导出查询结果时出现致命错误