4

任何人都可以帮忙吗?当我编写此代码并运行时。程序显示错误“已经有一个打开的 DataReader 与此命令关联,必须先关闭”。

这是我的代码。

Parallel.For(0, MthRange, i => {
    PSUpfrontFeeForMonth[i] = CommissionSummary
        .Where(s => s.TransDate == oReportCommonFilter.fromDate.AddMonths(i))
        .Sum(s => s.PSUpfrontFee);

    if (!PSUpfrontFeeForMonth[i].HasValue)
    {
        PSUpfrontFeeForMonth[i] = 0;
    }
});

谢谢。

问候,简

4

3 回答 3

4

并行化数据库查询是完全错误的,原因如下:

  1. 从每个处理器针对 sql 发出查询,因此将打开多个数据读取器 -> 'error'
  2. 没有实现性能提升,实际上程序变慢了,因为每个处理器都在尝试连接到数据库,并且实际上没有进行并行处理,因为所有查询处理都是在 sql 中完成的!所以在这种情况下,普通的串行查询会更快。
于 2010-11-26T07:21:14.260 回答
1

如果您确实需要同时打开多个数据库连接(正如其他人所说的不一定是一个好主意),那么您通常可以在连接字符串中指定这是需要的。

我使用它的典型场景是使用 DataReader 从数据库表中流式传输行(因为我不知道高级需要多少行),然后我需要在其他数据库表上进行额外的查询。我这样做而不是单个查询,因为它需要多个复杂的连接,而且我的应用程序有一个很好的缓存层来减少对数据库的查询。

对于 Microsoft SQL Server,您添加MultipleActiveResultSets=True;到连接字符串

于 2010-11-26T08:17:11.883 回答
0

我的猜测可能与 PSUpfrontFeeForMonth 在内部如何使用数据阅读器有关。

因为我不知道它是如何工作的,所以我首先会尝试在循环中初始化 PSUpfrontFeeForMonth。也许这将确保每次迭代都有一个专用的数据读取器。

于 2010-11-26T07:40:44.300 回答