我最近升级到devart 7.5并且一些功能无法正常工作。具体来说,我有一个返回IEnumerable的函数:
protected IEnumerable<BudgetTotals> getTotals(decimal groupId, decimal budgetId)
{
using (SsinpatDataContext dc = new SsinpatDataContext())
{
object[] ids = new object[2] { groupId, budgetId };
string sqlStr = "..."
var query = dc.ExecuteQuery<BudgetTotals>(sqlStr, ids);
return query;
}
}
到目前为止,一切正常,返回变量“query
”保存正确的值。
问题是当调用getTotals
时没有设置对象:
...
var query = getTotals(grpId,bdgId);
foreach(BudgetTotals bt in query)
{
...
}
现在,当控制到达foreach指令中的“in”时,会抛出一条带有"Object not set to an instance of an object"
消息的异常,这让我很困惑,因为
a)它工作正常并且
b)对象 在getTotals
函数内设置。
我可以通过将返回值从IEnumerable
更改为BudgetTotals[]
并返回query.ToArray
来解决问题。我尝试了它,它的工作原理。这里的主要问题是返回IEnumerable的所有其他函数。
在对应用程序进行大修之前,我想了解导致从devart 6.3到7.5的行为差异的原因或原因。
提前致谢
答案 0 :(得分:1)
在'getTotals'函数中执行ExecuteQuery方法时,将为当前DataContext对象(dc)打开用于获取数据的实体读取器。退出“getTotals”函数中的“using”块后,将放置DataContext对象(dc)并关闭其所有实体读取器。因此,当您尝试读取foreach语句中的数据时,读取器已经关闭,并且发生异常(我们已经更改了异常的文本,现在它将提供更多信息)。 JIC:在旧版本中,关闭实体读者可能存在一些问题。