Frage

Ich benutze SubSonic 2.1 und habe ein Problem getroffen, während ich eine Transaktion mit Ausführen habe

SharedDbConnectionsCope und TransactionsCope. Das Problem besteht

Ich habe das Problem in dieser Zeile aufgespürt:

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

In diesem Konstruktor der Benutzerklasse -A -Methode "LoadParam" wird aufgerufen, die letztendlich der Fall ist

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

Es sieht so aus, als ob der RDR.CLOSE () meine Verbindung implizit schließt, was bei der Verwendung der automatischen Konzeption in Ordnung ist. Aber während einer Transaktion ist es üblich keine gute Idee, die Verbindung zu schließen :-)

Meine Frage ist, ob dies von Design oder ob es sich um einen Fehler im MySQLDATAREADER handelt.

War es hilfreich?

Lösung

Das war schwierig! Nach ein bisschen Debugging fand ich die folgende Methode in der Datei subSonic2 mysqldatareader.cs:

    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;
        }

        ...
    }

Was falsch ist, da ich eine ShareddbConnection verwende. Im SQLDATAPROVIDER wurde es bereits für MySQLDATAREADER behoben.

Es sollte so aussehen:

        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;
        }

Ziemlich schwerer Fehler, es machte das Abfragen in einer Transaktion unmöglich (ich muss zugeben, dass ich das noch nie brauchte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top