2010-07-23 113 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將使用連接池來限制連接的總數,這是完全安全的,得到每個(組)查詢要執行一個新的連接。限制連接的範圍到一個線程和您的問題將消失。