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

时间:2013-04-01 13:16:45

标签: c# hyperlink devart

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

提前致谢

1 个答案:

答案 0 :(得分:1)

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