我有下面的代码时会触发在SQL SERVER 2008R2每个数据库上查询数据库连接,如何处理并行执行C#为
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
环路相同,那我该怎么做?是否有任何化妆品可以帮助并行Foreach循环好看;)
在此先感谢。
是的,你是对的,而且是需要它,我通过创建并行循环为'CON =新的SqlConnection(_ConnectionString)一个新的连接处理韩元DB连接;'这是不连续的foreach循环,我错过在连接时有什么东西?感谢您的回复。 – Darshan 2012-03-07 06:57:56
@Darshan:您还需要关闭数据库连接,否则最终会用尽可用的连接。 – Guffa 2012-03-07 07:02:28
连接关闭和打开由'SqlDataAdapter'自己处理。我不打开任何连接或手动关闭它。我想手动做? – Darshan 2012-03-07 07:06:15