2010-07-23 5 views
2

MySQL에 연결하기 위해 .NET Connector를 사용하고 있습니다.MySQL - 여러 결과 집합

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

이제까지 여러 MySQL의에서 지원이있을 것입니다 :이 내 응용 프로그램에서 MySQLDataReader 아직 닫혀 있지 않는 경우에도 동일한 연결을 사용하여 몇 개의 스레드가, 그리고 어떤 스레드가 쿼리를 실행하려고 그것은 그 오류를 제공 결과 집합이나 그것은?

내 데이터베이스 관리 클래스 :

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 컨트롤의 한계와 더 비슷하게 보입니다. –

+0

MySQL이 이것을 지원한다면, 나는이 웹 사이트에서이 기능을 발견 할 수 있습니다. : \ –

+0

코드를 게시 할 수 있습니까? –

답변

3

여러 결과가을 설정 여러 행 집합을 반환하는 단일 쿼리 또는 쿼리 일괄 처리를 말합니다. 이러한 결과는 해당 연결에 대한 유일한 DataReader를 통해 액세스됩니다.

당신이 원하는 것은 상당히 다른 것입니다. 단일 연결에 대해 여러 개의 동시 쿼리를 수행 할 수 있어야합니다. Afaik .NET은이를 지원하지 않으며 SQL Server 나 다른 드라이버를 지원하지 않습니다.

여러 스레드 간의 연결을 공유하는 것은 좋지 않으며 전혀 필요하지 않습니다. .NET은 연결 풀을 사용하여 총 연결 수를 제한하므로 실행하려는 각 (일련의) 쿼리에 대해 새 연결을 얻는 것이 안전합니다. 연결 범위를 스레드로 제한하면 문제가 해결됩니다.