SubSonic: MySqlDataReader chiude collegamento
-
23-10-2019 - |
Domanda
Sto usando SubSonic 2.1 e entcountered un problema durante l'esecuzione di una transazione con
SharedDbConnectionScope e TransactionScope. Il problema è che nel metodo obj.Save () ottengo un "Il collegamento deve essere valido e aperta" eccezione
I rintracciato il problema a questa linea:
// Loads a SubSonic ActiveRecord object
User user = new User(User.Columns.Username, "John Doe");
In questo costruttore della classe User di un metodo "LoadParam" si chiama che alla fine fa
if (rdr != null)
rdr.Close();
Sembra che il rdr.Close () chiude implicitamente il mio collegamento che va bene quando si utilizza l'AutomaticConnection. Ma durante una transazione non è eseguirne una buona idea per chiudere la connessione :-)
La mia domanda è se questo è di progettazione o se si tratta di un errore nella MySqlDataReader.
Soluzione
Questo è stato difficile! Dopo un po 'di debug ho trovato il seguente metodo nel file 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;
}
...
}
che è sbagliato dal momento che sto usando uno SharedDbConnection. Nel SqlDataProvider è stato fissato già, ma non per MySqlDataReader.
Si dovrebbe essere simile a questo:
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;
}
piuttosto pesante bug, è reso Interrogazione in una transazione impossibile (devo ammettere che non ho mai avuto bisogno di questo prima).