2017-06-21 1 views
4

Je suis en train de plusieurs requêtes dans mon code comme ci-dessous, mais il émet une exception à la ligne MySqlDataReader rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader(); depuis que j'ai déjà un rdr ouvertComment exécuter plusieurs requêtes à l'aide MysqlDataReader

I googlé et trouvé @according to MSDN son pas pris en charge, je besoin de conseils sur la façon de le réparer?

public IEnumerable<BuildNotes_op> RetrieveBuildDetails(string BuildID) 
    { 
     .... 
     var conn = new MySql.Data.MySqlClient.MySqlConnection(); 
     conn.ConnectionString = AciDev.aciDevConnectionString; 
     try 
     { 
      Console.WriteLine("Connecting to MySQL..."); 
      conn.Open(); 
      string sql = @"query1"; 
      MySqlCommand cmd = new MySqlCommand(sql, conn); 
      MySqlDataReader rdr = cmd.ExecuteReader(); --> **rdr open here** 
      .... 

      while (rdr.Read()) 
      { 
       ..... 
       if (rdr[4] != DBNull.Value) 
        .................... 
       else 
        ........ 
        string sql_get_latest_build_notes_cmd = "query2"; 

        MySqlCommand get_latest_build_notes_cmd = new MySqlCommand(sql_get_latest_build_notes_cmd, conn); 
        MySqlDataReader rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader(); --> **throws exception here** 
        if (rdr_get_latest_build_notes.HasRows) 
        { 
         .................... 

        } 
        rdr_get_latest_build_notes.Close(); 

       if (BuildDetails != null) 
       { 
        BuildNotesDetails.Add(BuildDetails); 
       } 
      } 
      rdr.Close(); 
      conn.Close(); 
      return BuildNotesDetails; 
     } 

     catch 
     { 
      throw; 
     } 
     finally 
     { 
      conn.Close(); 
     } 

Exception:

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

Répondre

1

essayez ceci:

public IEnumerable<BuildNotes_op> RetrieveBuildDetails(string BuildID) 
    { 

     var conn = new MySql.Data.MySqlClient.MySqlConnection(); 
     var conn2 = new MySql.Data.MySqlClient.MySqlConnection(); 
     conn.ConnectionString = AciDev.aciDevConnectionString; 
     try 
     { 
      Console.WriteLine("Connecting to MySQL..."); 
      conn.Open(); 
      string sql = @"query1"; 
      MySqlCommand cmd = new MySqlCommand(sql, conn); 
      MySqlDataReader rdr = cmd.ExecuteReader(); --> **rdr open here** 
      .... 

      while (rdr.Read()) 
      { 
       ..... 
       if (rdr[4] != DBNull.Value) 
        .................... 
       else 
        ........ 
        string sql_get_latest_build_notes_cmd = "query2"; 

        conn2.ConnectionString = AciDev.aciDevConnectionString; 

       Console.WriteLine("Connecting to MySQL..."); 
        conn2.Open(); 
        MySqlCommand get_latest_build_notes_cmd = new MySqlCommand(sql_get_latest_build_notes_cmd, conn2); 
        MySqlDataReader rdr_get_latest_build_notes = get_latest_build_notes_cmd.ExecuteReader(); --> **throws exception here** 
        if (rdr_get_latest_build_notes.HasRows) 
        { 
         .................... 

        } 
        rdr_get_latest_build_notes.Close(); 
        conn2.Close(); 

       if (BuildDetails != null) 
       { 
        BuildNotesDetails.Add(BuildDetails); 
       } 
      } 
      rdr_get_latest_build_notes.Close(); 
      rdr.Close(); 
      conn.Close(); 
      conn2.Close(); 
      return BuildNotesDetails; 
     } 

     catch 
     { 
      throw; 
     } 
     finally 
     { 
      rdr_get_latest_build_notes.Close(); 
      rdr.Close(); 
      conn.Close(); 
      conn2.Close(); 
     } 

Création d'une seconde connection var

0

Options:

  • consomment la première requête complètement mise en mémoire tampon les données dans un List<T> ou similaire, avant de lancer la requête interne/requêtes
  • utilisation join etc pour lire toutes les données en une seule fois, comme un jeu de résultats unique - et le traiter au client
  • utiliser plusieurs select opérations dans une seule commande pour récupérer les données contenues dans les grilles et les traiter au client
  • utiliser plusieurs connexions
+0

Je pensais utiliser plusieurs connexions @ 'MySqlCommand get_latest_build_notes_cmd = new MySqlCommand (sql_get_latest_build_n otes_cmd, conn); ', avez-vous quelque chose d'autre à l'esprit? Si oui, veuillez préciser exactement –

+0

@JeffShort qui utilise plusieurs commandes simultanément contre une seule connexion –

+0

Avez-vous un exemple spécifique sur la façon d'initier plusieurs connexions?> –