SubSonic: MySqldatareader schließt die Verbindung
-
23-10-2019 - |
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.
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).