我有以下代码将在 SQL SERVER 2008R2 中的每个数据库上触发查询,
public DataTable GetResultsOfAllDB(string query)
{
SqlConnection con = new SqlConnection(_ConnectionString);
string locleQuery = "select name from [master].sys.sysdatabases";
DataTable dtResult = new DataTable("Result");
SqlCommand cmdData = new SqlCommand(locleQuery, con);
cmdData.CommandTimeout = 0;
SqlDataAdapter adapter = new SqlDataAdapter(cmdData);
DataTable dtDataBases = new DataTable("DataBase");
adapter.Fill(dtDataBases);
// This is implemented for sequential
foreach (DataRow drDB in dtDataBases.Rows)
{
locleQuery = " Use [" + Convert.ToString(drDB[0]) + "]; " + query;
cmdData = new SqlCommand(locleQuery, con);
adapter = new SqlDataAdapter(cmdData);
DataTable dtTemp = new DataTable();
adapter.Fill(dtTemp);
dtResult.Merge(dtTemp);
}
//Parallel Implementation
Parallel.ForEach(dtDataBases.AsEnumerable(), drDB =>
{
locleQuery = " Use [" + Convert.ToString(drDB[0]) + "]; " + query;
con = new SqlConnection(_ConnectionString);
cmdData = new SqlCommand(locleQuery, con);
cmdData.CommandTimeout = 0;
adapter = new SqlDataAdapter(cmdData);
DataTable dtTemp = new DataTable();
adapter.Fill(dtTemp);
dtResult.Merge(dtTemp);
}
);
return dtResult;
}
现在的问题是当我使用第二个循环时,即
Parallel ForEach
循环它在 adapter.Fill(dtTemp);
行给了我不同的错误如下,是的,当然这些都是预期的错误。
Blha Blha ... 所有与连接相关的错误。
注意:有时它像魅力一样工作,我的意思是没有错误。
绝对是第一个循环,即顺序
foreach
循环工作正常,但性能不是很好看,我爱上了它:)现在我的问题是我是否想使用
parallel foreach
循环相同,那么我应该怎么做?是否有任何化妆品可以帮助 Parallel Foreach 循环好看;)提前致谢。
最佳答案
数据库连接一次只能运行一个查询,因此当一个线程在连接繁忙时尝试运行查询时,您会收到错误消息。如果要并行运行查询,每个线程都需要自己的数据库连接。
关于c#-4.0 - 如何处理数据库连接的并行执行 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596833/