我有下面的代碼時會觸發在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