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.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top