2010-07-23 115 views
2

我使用.NET连接器连接到MySQL。 在我的应用程序有使用相同的连接线程数,所以如果一个了MySqlDataReader还没有结束,有些线程试图执行一个查询它给出了错误:MySQL的 - 多个结果集

There is already an open DataReader associated with this Connection which must be closed first.

将永远在那里在MySQL支持多种结果集或其名称?

public class DatabaseConnection 
{ 
    private MySqlConnection conn; 

    public void Connect(string server, string user, string password, string database, int port = 3306) 
    { 
     string connStr = String.Format("server={0};user={1};database={2};port={3};password={4};charset=utf8", 
      server, user, database, port, password); 
     conn = new MySqlConnection(connStr); 
     conn.Open(); 
    } 

    private MySqlCommand PrepareQuery(string query, object[] args) 
    { 
     MySqlCommand cmd = new MySqlCommand(); 
     cmd.Connection = conn; 
     for (int i = 0; i < args.Length; i++) 
     { 
      string param = "{" + i + "}"; 
      string paramName = "@DBVar_" + i; 
      query = query.Replace(param, paramName); 
      cmd.Parameters.AddWithValue(paramName, args[i]); 
     } 
     cmd.CommandText = query; 
     return cmd; 
    } 

    public List<Dictionary<string, object>> Query(string query, params object[] args) 
    { 
     MySqlCommand cmd = PrepareQuery(query, args); 
     MySqlDataReader reader = cmd.ExecuteReader(); 
     List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
     while (reader.Read()) 
     { 
      Dictionary<string, object> row = new Dictionary<string, object>(); 
      for (int i = 0; i < reader.FieldCount; i++) 
      { 
       row.Add(reader.GetName(i), reader.GetValue(i)); 
      } 
      rows.Add(row); 
     } 
     reader.Close(); 
     return rows; 
    } 

    public object ScalarQuery(string query, params object[] args) 
    { 
     MySqlCommand cmd = PrepareQuery(query, args); 
     return cmd.ExecuteScalar(); 
    } 

    public void Execute(string query, params object[] args) 
    { 
     MySqlCommand cmd = PrepareQuery(query, args); 
     cmd.ExecuteNonQuery(); 
    } 

    public void Close() 
    { 
     conn.Close(); 
    } 
} 

的我如何使用这样的一个例子:

DatabaseConnection Conn = new DatabaseConnection(); 
Conn.Connect("localhost", "root", "", "foogle"); 
var rows = conn.Query("SELECT * FROM `posts` WHERE `id` = {0}", postID); 
foreach (var row in rows) 
{ 
    Console.WriteLine(row["title"]); // Writes the post's title (example) 
} 
+0

我不会说这是由于MySQL的。看起来更像是MySQLDataReader控件的限制。 – 2010-07-23 19:57:31

+0

如果MySQL支持这个,我可以在他们的网站上找到这个功能..:\ – 2010-07-23 19:58:57

+0

你可以发布你的代码吗? – 2010-07-24 07:13:43

回答

3

多个结果集是指一个查询或查询批处理返回多个行集

我的数据库管理类。这些结果是通过该连接的唯一DataReader访问的。

你问什么是完全不同的东西。您需要能够对单个连接执行多个同时查询。 Afaik .NET不支持该功能,不适用于SQL Server或任何其他驱动程序。

共享多个线程之间的连接是一个坏主意,完全没有必要。 .NET将使用连接池来限制连接的总数,这是完全安全的,得到每个(组)查询要执行一个新的连接。限制连接的范围到一个线程和您的问题将消失。