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