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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top