2010-06-02 5 views
0

J'utilise SubSonic 2.1 et entcountered un problème lors de l'exécution d'une transaction avecSubSonic: MySqlDataReader ferme la connexion

SharedDbConnectionScope et TransactionScope. Le problème est que dans la méthode obj.Save() Je reçois un « La connexion doit être valide et ouvrir » exception

Je traqué le problème à cette ligne:

// Loads a SubSonic ActiveRecord object 
User user = new User(User.Columns.Username, "John Doe"); 

dans ce constructeur de la classe utilisateur une méthode « LoadParam » est appelée, qui fait finalement

if (rdr != null) 
    rdr.Close(); 

on dirait que le rdr.Close() ferme implicitement ma connexion qui est bien lorsque vous utilisez le AutomaticConnection. Mais lors d'une transaction, il n'est habituellement pas une bonne idée de fermer la connexion :-)

Ma question est de savoir si cela est voulu ou s'il s'agit d'une erreur dans MySqlDataReader.

Répondre

0

C'était difficile! Après un débogage peu je trouve la méthode suivante dans le fichier MySqlDataReader.cs SubSonic2:

public override IDataReader GetReader(QueryCommand qry) 
    { 
     AutomaticConnectionScope conn = new AutomaticConnectionScope(this); 

     ... 

     cmd.Connection = (MySqlConnection)conn.Connection; 

     IDataReader rdr; 

     try 
     { 
      rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
     } 
     catch(MySqlException x) 
     { 
      conn.Dispose(); 
      throw x; 
     } 

     ... 
    } 

Ce qui est faux puisque je me sers d'un SharedDbConnection. Dans le SqlDataProvider il a déjà été corrigé mais pas pour MySqlDataReader.

Il devrait ressembler à ceci:

 try 
     { 
      // if it is a shared connection, we shouldn't be telling the reader to close it when it is done 
      rdr = conn .IsUsingSharedConnection ? 
         cmd.ExecuteReader() : 
         cmd.ExecuteReader(CommandBehavior.CloseConnection); 
     } 
     catch (MySqlException) 
     { 
      // AutoConnectionScope will figure out what to do with the connection 
      conn.Dispose(); 
      //rethrow retaining stack trace. 
      throw; 
     } 

bug assez lourd, il a rendu Interrogation dans une transaction impossible (je dois admettre que je ne avais besoin auparavant).

Questions connexes