Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

This SqlTransaction has completed; it is no longer usable.

Îåêßíçóå áðü ôï ìÝëïò Παπαδημητρίου Γεώργιος. Τελευταία δημοσίευση από το μέλος Thiseas στις 10-10-2007, 10:28. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-10-2007, 23:42 36050

    This SqlTransaction has completed; it is no longer usable.

    Οποιος επιθυμει θα μπορουσε να παραβρεθει στα βαφτισια μου,
    γιατι με το μηνυμα λαθους που αντιμετωπιζω στο rollback της transaction κοντευω να ξεβαπτιστω!

    This SqlTransaction has completed; it is no longer usable.

    Οποιαδηποτε βοηθεια θα την εκτιμουσα ιδιαιτερως!
    Σας ευχαριστω!

    Dim myConnection As SqlConnection = New SqlConnection(strConn)

    myConnection.Open()

    Dim myTrans As SqlTransaction = myConnection.BeginTransaction()
    Dim cmd As SqlCommand = myConnection.CreateCommand()

    cmd.Transaction = myTrans

    Try

    cmd.CommandText = "Insert into Members (Name, Surname, Uid, Password, Email) " & _

    "Values (@Name, @Surname, @Uid, @Password, @Email)"

    With cmd.Parameters

    .Add(New SqlParameter("@Name", txtName.Text))

    .Add(New SqlParameter("@Surname", txtSurname.Text))

    .Add(New SqlParameter("@Uid", txtLogin.Text))

    .Add(New SqlParameter("@Password", txtPassword.Text))

    .Add(New SqlParameter("@Email", txtEmailll.Text))

    End With

    cmd.ExecuteNonQuery()

    myTrans.Commit()

     

    Catch ex As Exception

    Try

    myTrans.Rollback()    << ΣΕ ΑΥΤΟ ΤΟ ΣΗΜΕΙΟ ΤΟ CONNECTION EINAI AKOMH ANOIXTO

    Catch ex2 As Exception

    MsgBox(ex2.Message.ToString)

    End Try

    cmd.Connection.Close()

    End Try

    End Sub

     

  •  10-10-2007, 09:24 36052 σε απάντηση της 36050

    Απ: This SqlTransaction has completed; it is no longer usable.

    Το μήνυμα λάθους μπορεί να οφείλεται σε πολλούς λόγους. Καλό θα είναι να βάλεις τον Profiler για να δεις τι συμβαίνει πάνω στον server, πότε ανοίγει το connection, πότε ξεκινάει το transaction, πότε κλείνει το transaction και πότε το connection, καθώς εκτελείς τον κώδικα γραμμή-γραμμή. Επίσης, μπορείς να χρησιμοποιήσεις ένα δεύτερο SqlCommand το οποίο θα είναι "select @@Trancount". Αυτό θα πρέπει να σου επιστρέφει 0 πριν ξεκινήσει το transaction και 1 όσο είναι ενεργό. Άρα, αν δεις να επιστρέφει 0 πριν γίνει το commit, πάει να πει ότι με κάποιον τρόπο έχει κλείσει.

    Happy debugging Smile


    Vir prudens non contra ventum mingit
  •  10-10-2007, 10:02 36056 σε απάντηση της 36050

    Απ: This SqlTransaction has completed; it is no longer usable.

    Κατ' αρχήν τα ευαγγέλια λένε ότι όταν φτιάχνεις command θα πρέπει να του θέτεις και το connection εκτός από το transaction. Επιπλέον, όταν μπεις στο catch block, το transaction μπορεί να έχει γίνει ήδη rollback στο server, οπότε το Rolback() πρέπει να βρίσκεται μέσα σε δικό του try ... catch block.


    Νατάσα Μανουσοπούλου
  •  10-10-2007, 10:26 36057 σε απάντηση της 36050

    Απ: This SqlTransaction has completed; it is no longer usable.

    Δεν μπορώ να δω κάτι συγκεκριμένο. Προτείνω να κάνεις αυτό που λέει και ο Μάνος παραπάνω με τον profiler. Βλέπω όμως διάφορα πράγματα που θέλουν βελτίωση.

    1. Το 1ο try πρέπει να ξεκινάει ακριβώς μετά το BeginTransaction, διαφορετικά αν συμβεί ένα exception στις δυο επόμενες γραμμές μέχρι εκεί που έχεις το try, το transaction δεν θα κλείσει έγκαιρα. (edited: μπορεί να είναι εξαιρετικά απίθανο να συμβεί εκεί exception, αλλά όταν αργότερα μπεις στον κώδικα και προσθέσεις κι άλλα πράγματα εκεί, τα οποία μπορεί να περιέχουν πιθανά exceptions θα έχεις πρόβλημα. Είναι κλασσική περίπτωση "δημιουργίας" bug κατά τη συντήρηση του κώδικα).
    2. Επίσης στο πρώτο catch αποκρύπτεις τελείως το exception, δηλαδή δεν το εμφανίζεις πουθενά, με αποτέλεσμα να μην βλέπεις για πιο λόγο έχει γίνει κάτι λάθος.
    3. Το cmd.Connection.Close πρέπει να είναι myConnection.Close. Μπορεί να είναι ισοδύναμο σε επίπεδο compiler, αλλά από πλευράς συντήρησης του κώδικα δεν είναι.
    4. Το Connection.Close πρέπει να είναι έξω από όλα τα try/catch, έτσι ώστε να κλείνει σωστά και έγκαιρα και όταν δεν συμβεί exception (πράγμα που θα είναι και το πιο πιθανό, όταν ο κώδικάς σου τρέχει τελικά).

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  10-10-2007, 10:28 36059 σε απάντηση της 36056

    Απ: This SqlTransaction has completed; it is no longer usable.

    Η τελευταία εντολή σου "End Sub" δηλώνει το τέλος μιας sub routine, αλλά δεν ξέρουμε που είναι η αρχή...

    Τι θέλω να πω:
    1. Αν το κομμάτι κώδικα που μας δίνεις βρίσκεται σε κάποια sub-routine η οποία έχει κι άλλες εντολές, καλό θα ήτανε είτε να τις λάβεις υπ'όψη σου είτε να μας τις δείξεις.
    2. Αν αυτή η sub-routine καλείται από ένα άλλο εξωτερικό κώδικα ο οποίος βρίσκεται (και αυτός) σε try και στο  Catch δεν κάνει τίποτε τότε ΑΝ οι παρακάτω εντολές αποτύχουν, δεν θα πάρεις "μυρωδια"!!!
    myConnection.Open()
    Dim myTrans As SqlTransaction = myConnection.BeginTransaction()
    Dim
    cmd As SqlCommand = myConnection.CreateCommand()


    Nothing to declare...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems