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