Subsonic: MySqlDatarader cierra la conexión
-
23-10-2019 - |
Pregunta
Estoy usando Subsonic 2.1 y entountered un problema al ejecutar una transacción con
SharedDBConnectionsCope y TransactionScope. El problema es que en el método obj.save () obtengo una excepción "la conexión debe ser válida y abierta"
Rastreé el problema a esta línea:
// Loads a SubSonic ActiveRecord object
User user = new User(User.Columns.Username, "John Doe");
En este constructor del método de Clase A de usuario se llama "LoadParam".
if (rdr != null)
rdr.Close();
Parece que el RDR.Close () cierra implícitamente mi conexión, lo cual está bien cuando se usa AutomaticConnection. Pero durante una transacción no es una buena idea cerrar la conexión :-)
Mi pregunta es si esto es por diseño o si es un error en el mysqldatarader.
Solución
¡Eso fue complicado! Después de un poco de depuración, encontré el siguiente método en el archivo 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;
}
...
}
Lo cual está mal ya que estoy usando una Conconnección SharedDB. En el sqldataprovider ya se ha solucionado, pero no para mysqldatarader.
Debe tener un aspecto como este:
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;
}
Error bastante pesado, hizo una consulta en una transacción imposible (debo admitir que nunca antes había necesitado esto).