c# – Parallel.Foreach SQL查询有时会导致连接
发布时间:2020-12-16 00:07:28 所属栏目:百科 来源:网络整理
导读:我需要加快在我的应用程序中执行12个查询.我从常规foreach切换到Parallel.ForEach.但有时我会收到一条错误消息“ExecuteReader需要一个开放且可用的连接.连接的当前状态正在连接.”我的理解是,由于12个查询中的许多查询都使用相同的InitialCatalog,因此12中
我需要加快在我的应用程序中执行12个查询.我从常规foreach切换到Parallel.ForEach.但有时我会收到一条错误消息“ExecuteReader需要一个开放且可用的连接.连接的当前状态正在连接.”我的理解是,由于12个查询中的许多查询都使用相同的InitialCatalog,因此12中没有真正的新连接,这可能是问题所在?我怎样才能解决这个问题? “sql”是“Sql”类型的列表 – 一个类只是一个字符串名称,字符串connectiona和一个查询列表.这是代码:
/// <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; } 这是我制作的你需要的Sql类: /// <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>(); } 解决方法
我会重构你的业务逻辑(连接到数据库).
public class SqlOperation { public SqlOperation() { Queries = new List<string>(); } public string TableName { get; set; } public string ConnectionString { get; set; } public List<string> Queries { get; set; } } public static List<DataTable> GetAllData(IEnumerable<SqlOperation> sql) { var taskArray = sql.SelectMany(s => s.Queries .Select(query => Task.Run(() => //Task.Factory.StartNew for .NET 4.0 ExecuteQuery(s.ConnectionString,s.TableName,query)))) .ToArray(); try { Task.WaitAll(taskArray); } catch(AggregateException e) { MessageBox.Show(e.ToString(),"GetAllData error"); } return taskArray.Where(t => !t.IsFaulted).Select(t => t.Result).ToList(); } public static DataTable ExecuteQuery(string connectionString,string tableName,string query) { DataTable dataTable = null; using (var connection = new SqlConnection(connectionString)) { dataTable = new DataTable(); dataTable.TableName = tableName; using(var command = new SqlCommand(query,connection)) { connection.Open(); using(var adapter = new SqlDataAdapter()) { adapter.SelectCommand = command; adapter.Fill(dataTable); } } } return dataTable; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 如何为Postgresql数据库全文搜索(full text search)编写解析
- VB6.0如何判断ADODB.Connection是否关闭
- swift – 如何将firebase数据库数据作为UICollection View的
- cocos2dx 基础学习(一)
- c# – 查询列表或数据库是否更快?
- ruby-on-rails – 设计用户sign_in给出了CSRF令牌真实性令牌
- CocoStudio:ImageView分析
- hdu 4008 树形dp
- ruby-on-rails-3 – 如何在Jasmine中包含来自CDN的javascri
- React native (6) scrollview listview