2012-06-22 2 views
4

Я написал пользовательский класс для обработки запросов к базе данных на удаленный и локальную базу данных MySQL, однако, когда я вложенный цикл я получаю ошибку ниже:вложенной проблема чтения данных MySQL C#

MySql.Data.MySqlClient.MySqlException was unhandled 
Message=There is already an open DataReader associated with this Connection which must be closed first. 
Source=MySql.Data 
ErrorCode=-2147467259 
Number=0 

Моего класс в настоящее время выглядит следующим образом

public class MySQLManager 
{ 
    private MySqlConnection _MySQLRemoteConnection { get; set; } 
    public void setup(string remoteUser, string remotePass, string remoteServerAddress, string remoteDb, string localUser, string localPass, string localServerAddress, string localDb) 
    { 
     _remote_server_address = remoteServerAddress; 
     _remote_database = remoteDb; 
     _remote_username = remoteUser; 
     _remote_password = remotePass;  
    } 
    public void connect() 
    { 
     try 
     { 
      _MySQLRemoteConnection = new MySqlConnection() { ConnectionString = string.Format("server={0};database={1};uid={2};password={3};", _remote_server_address, _remote_database, _remote_username, _remote_password) }; 
      _MySQLRemoteConnection.Open(); 
      _RemoteConnection = true; 
     } 
     catch (MySqlException ex) 
     { 
      _RemoteConnection = false; 
     } 
    } 
    public MySqlCommand run(string query, List<MySqlParameter> dbparams = null) 
    { 
     connect(); 

     MySqlCommand sql = getConnection().CreateCommand(); 
     sql.CommandText = query; 
     if (dbparams != null) 
     { 
      if (dbparams.Count > 0) 
      { 
       sql.Parameters.AddRange(dbparams.ToArray()); 
      } 
     } 
     //disconnect(); 
     return sql; 
    } 
    public MySqlDataReader fetch(MySqlCommand cmd) 
    { 
     //connect(); 
     var t = cmd.ExecuteReader(); 
     //disconnect(); 
     return t; 
    } 

И код, который я бегу, чтобы создать ошибку, теперь я понимаю, что я могу сделать в приведенном ниже примере в одном запросе, это пример запроса, чтобы воссоздать ошибку, написание он в один запрос не будет работать с живыми примерами.

query = "SELECT field1 FROM tmp WHERE field1 < 3"; 
      using (var sql = db.run(query)) 
      { 
       txtResponse.Text += "Query ran" + nl; 
       using (var row = db.fetch(sql)) 
       { 
        txtResponse.Text += "Query fetched" + nl; 

        db.connect(); 
        while (row.Read()) 
        { 
         txtResponse.Text += "Row : " + row[0].ToString() + nl; 
         query = "SELECT val1 FROM tmp2 WHERE field1 = '" + row[0].ToString() + "'"; 
         //db.disconnect(); 
         using (var sql2 = db.run(query)) 
         { 
          txtResponse.Text += "Query ran" + nl; 
          db.disconnect(); 
          using (var row2 = db.fetch(sql)) 
          { 
           txtResponse.Text += "Query fetched" + nl; 
           db.connect(); 
           while (row.Read()) 
           { 
            txtResponse.Text += "  Val : " + row2[0].ToString() + nl; 
           } 
          } 
         } 
        } 
       } 
      } 

Итак, как бы я мог заставить второй цикл работать?

ответ

1

Для SQL Server вы можете использовать MultipleActiveResultSets = true в строке подключения, но это скорее всего не будет работать для MySQL.

Другой вариант - использовать 2 подключения, по одному для каждого устройства чтения данных.

Смежные вопросы