У меня есть следующий код, который будет запускать запрос для каждой базы данных в 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 хорошо выглядеть;)
Заранее спасибо.