Question

J'utilise SubSonic 2.1 et entcountered un problème lors de l'exécution d'une transaction avec

SharedDbConnectionScope et TransactionScope. Le problème est que dans la méthode obj.Save () Je reçois un « La connexion doit être valide et ouverte » 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 suite

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

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

Ma question est de savoir si cela est par la conception ou si elle est une erreur dans le MySqlDataReader.

Était-ce utile?

La solution

C'était difficile! Après un peu de débogage j'ai trouvé 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é fixée 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;
        }

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top