Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    errore durante il commit (o rollback) di una transazione

    Salve a tutti, non riesco a capire perchè ricevo questo errore:
    This SqlTransaction has completed; it is no longer usable.

    quando cerco di chiudere una transazione. Ho controllato 100 volte il codice, e non mi sembra ci sia niente di sbagliato (un'altra chiamata precedente, variabili sballate).

    P.S. chiamo i metodi BeginaTrans, Commit e/o Rollback tramite 3 funzioni diverse di una classe da me creata.
    Questo il codice per le 3 operazioni più l'esecuzione della query.
    codice:
        Public sub BeginTransaction()
            Me.Conn = New SqlConnection(Me.sConnStr)
    
            Me.Conn.Open()
    
            'Start a local transaction
            Me.myTransaction = Conn.BeginTransaction()
    
            Me.mySqlCommand = new SqlCommand()
            Me.mySqlCommand.Connection = Me.Conn
            Me.mySqlCommand.Transaction = Me.myTransaction
    
        end sub
    
        Public sub CommitTransaction()
            Me.myTransaction.Commit()
            Me.Conn.Close()
        end sub
    
        Public function RollbackTransaction()
            Me.myTransaction.Rollback()
            Me.Conn.Close()
        end function
    
    
        Public function ExecuteNonQuery(ByVal SQL As String, optional sqlParameters as ArrayList = nothing, optional toClose as boolean = true) as object
            Dim objReturn as object = nothing
            if Me.Conn is nothing then
                Me.Conn = New SqlConnection(Me.sConnStr)
                Me.Conn.Open()
            else
                if Me.Conn.State <> ConnectionState.Open then Me.Conn.Open()
            end if
    
            if Me.mySqlCommand is nothing then
                Me.mySqlCommand = new SqlCommand(SQL, Me.Conn)
            else
                Me.mySqlCommand.CommandText = SQL
            end if
    
            Try
                if not sqlParameters is nothing then
                    Me.mySqlCommand.CommandType = CommandType.StoredProcedure
                    Dim sqlPar as SqlParameter
                    for each sqlPar in sqlParameters
                        Me.mySqlCommand.Parameters.Add(sqlPar)
                    next
                else
                    Me.mySqlCommand.CommandType = CommandType.Text
                end if            
                Me.mySqlCommand.ExecuteNonQuery()
            Catch e As Exception
                objReturn = e
            End Try
    
            'must be clean up?
            if toClose then
                Me.Conn.Close()
                Me.mySqlCommand.Dispose()
                Me.Conn.Dispose()
            end if
            
            return objReturn
        End function
    Ci sto impazzendo da qualche giorno, spero possiate aiutarmi.

  2. #2
    Nella sub BeginTransactio apri una nuova connessione differente da quella che utilizzi nella ExecuteNonQuery.
    Una transazione è collegata ad una connessione e se non è la stessa quando fai la commit o la rollback di sicuro ti darà errore.
    Prova a passarla come parametro!
    Fammi sapere!
    Ciao
    Kalman
    Kalman

  3. #3
    Nella sub BeginTransaction apri una nuova connessione differente da quella che utilizzi nella ExecuteNonQuery.
    Una transazione è collegata ad una connessione e se non è la stessa quando fai la commit o la rollback di sicuro ti darà errore.
    Prova a passarla come parametro!
    Fammi sapere!
    Ciao
    Kalman
    Kalman

  4. #4
    Originariamente inviato da Kalman
    Nella sub BeginTransactio apri una nuova connessione differente da quella che utilizzi nella ExecuteNonQuery.
    Una transazione è collegata ad una connessione e se non è la stessa quando fai la commit o la rollback di sicuro ti darà errore.
    Prova a passarla come parametro!
    Fammi sapere!
    Ciao
    Kalman
    Non ho capito cosa intendi con "passarla come parametro" (cioè a quale funzione dovrei passarla?), però ho modificato la funzione BeginTransaction in questo modo e sembra funzionare:
    codice:
        Public sub BeginTransaction()
            Dim Cn as New SqlConnection(Me.sConnStr)
            'Me.Conn = New SqlConnection(Me.sConnStr)
    
            Cn.Open()
    
            'Start a local transaction
            Me.myTransaction = Cn.BeginTransaction()
    
            Me.mySqlCommand = new SqlCommand()
            Me.mySqlCommand.Connection = Cn
            Me.mySqlCommand.Transaction = Me.myTransaction
    
        end sub
    Anche se non capisco perchè funziona. Anche prima non era la stessa connessione? Cioè la variabile privata della classe?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.