0

我最近升级到 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


我可以通过将返回值从IEnumerableto更改BudgetTotals[]并返回来解决问题query.ToArray。我试过了,它有效。这里的主要问题是所有其他返回 IEnumerable 的函数。

在彻底检查应用程序之前,我想了解导致从 devart 6.3 到 7.5 的行为差异的原因或原因。

提前致谢

4

1 回答 1

1

在“getTotals”函数中执行 ExecuteQuery 方法时,会为当前 DataContext 对象 (dc) 打开一个用于获取数据的实体读取器。退出“getTotals”函数中的“使用”块后,DataContext 对象 (dc) 被释放并关闭其所有实体读取器。因此,当您尝试读取 foreach 语句中的数据时,读取器已经关闭,并且发生了异常(我们已经更改了异常的文本,现在它将提供更多信息)。JIC:在旧版本中,关闭实体阅读器可能会出现一些问题。

于 2013-04-03T10:02:07.800 回答