在查询结果上启动 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 ON
或SET 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 上的空消息