2010-11-26 73 views
4

任何人都可以提供帮助吗?当我写这个代码并运行。该程序向我显示错误陈述“已经有一个打开的DataReader与这个命令关联,必须先关闭”。c#并行循环错误

这是我的代码。

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; 
    } 
}); 

谢谢。

问候, 简

+3

对于可读性的原因,你应该标注任何的代码为“代码示例”,您可以通过突出显示的代码,然后点击101010按钮做到这一点。 – Waqas 2010-11-26 07:16:52

回答

4

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

  1. 查询从 每个处理器使多个数据 读者会打开针对SQL发行 - >“错误'
  2. 没有实现性能增益,实际上 程序变得更慢,因为每个处理器都尝试连接 数据库并没有并行 处理实际上是因为所有的 查询处理都是在sql中完成的!所以 正常的串行查询在 这种情况下更快。
0

我的猜测将与PSUpfrontFeeForMonth如何在内部工作使用数据读取器有关。

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

1

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

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

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