En parallèle.Foreach SQL d'interrogation parfois des résultats dans le cadre

J'ai besoin d'accélérer l'exécution de 12 requêtes dans mon application. Je suis passé à partir d'une boucle foreach pour Parallèle.ForEach. Mais parfois, je reçois un message d'erreur indiquant "ExecuteReader nécessite une connexion ouverte et disponible La connexion de l'état actuel de la connexion." C'est ma compréhension que, puisque la plupart des 12 requêtes à l'aide de la même InitialCatalog, il n'est pas vraiment une nouvelle connexion pour les de la 12 et que peut être le problème? Comment puis-je résoudre ce problème? "sql" est une liste de type "Sql"- une classe est juste un nom de chaîne, chaîne de connectiona et une Liste de requêtes. Voici le code:

 ///<summary>
///Connects to SQL, performs all queries and stores results in a list of DataTables
///</summary>
///<returns>List of data tables for each query in the config file</returns>
public List<DataTable> GetAllData()
{
Stopwatch sw = new Stopwatch();
sw.Start();
List<DataTable> data = new List<DataTable>();
List<Sql> sql=new List<Sql>();
Sql one = new Sql();
one.connection = "Data Source=XXX-SQL1;Initial Catalog=XXXDB;Integrated Security=True";
one.name = "Col1";
one.queries.Add("SELECT Name FROM [Reports]");
one.queries.Add("SELECT Other FROM [Reports2]");
sql.Add(one);
Sql two = new Sql();
two.connection = "Data Source=XXX-SQL1;Initial Catalog=XXXDB;Integrated Security=True";
two.name = "Col2";
two.queries.Add("SELECT AlternateName FROM [Reports1]");
sql.Add(two);
Sql three = new Sql();
three.connection = "Data Source=YYY-SQL2;Initial Catalog=YYYDB;Integrated Security=True";
three.name = "Col3";
three.queries.Add("SELECT Frequency FROM Times");
sql.Add(three);
try
{
//ParallelOptions options = new ParallelOptions();
//options.MaxDegreeOfParallelism = 3;
//Parallel.ForEach(sql, options, s =>
Parallel.ForEach(sql, s =>
//foreach (Sql s in sql)
{
foreach (string q in s.queries)
{
using (connection = new SqlConnection(s.connection))
{
connection.Open();
DataTable dt = new DataTable();
dt.TableName = s.name;
command = new SqlCommand(q, connection);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = command;
adapter.Fill(dt);
//adapter.Dispose();
lock (data)
{
data.Add(dt);
}
}
}
}
);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "GetAllData error");
}
sw.Stop();
MessageBox.Show(sw.Elapsed.ToString());
return data;
}

Voici le code Sql de la classe j'ai fait ce que vous auriez besoin:

///<summary>
///Class defines a SQL connection and its respective queries
///</summary>
public class Sql
{
///<summary>
///Name of the connection/query
///</summary>
public string name { get; set; }
///<summary>
///SQL Connection string
///</summary>
public string connection { get; set; }
///<summary>
///List of SQL queries for a connection
///</summary>
public List<string> queries = new List<string>();
}

OriginalL'auteur Theodosius Von Richthofen | 2013-04-18