devart直流.ExecuteQuery返回未设置为对象实例的Object

本文关键字:对象 实例 Object 设置 直流 ExecuteQuery 返回 devart | 更新日期: 2023-09-27 18:06:44

我最近升级到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之间的行为差异。

Thanks in advance

devart直流.ExecuteQuery返回未设置为对象实例的Object

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