У меня есть общий метод для библиотеки, который выполняет все запросы SQL в качестве параметров, но однажды было сгенерировано исключение, когда этот метод попытался откатить запрос, который всегда работает нормально. Исключение составляло
Эта SqlTransaction завершена; его больше нельзя использовать.
Метод довольно прост, например:
Dim auxConnectionSB As New SqlClient.SqlConnectionStringBuilder
With auxConnectionSB
.InitialCatalog = ""
.DataSource = ""
.UserID = ""
.Password = ""
.Pooling = ""
End With
Using auxConnection = New SqlClient.SqlConnection(auxConnectionSB.ToString)
Try
auxConnection.Open()
Using auxTransaction = auxConnection.BeginTransaction
Try
For Each query In querys
Dim auxCommand = auxConnection.CreateCommand
auxCommand.CommandText = query
auxCommand.Transaction = auxTransaction
auxCommand.ExecuteNonQuery()
Next
auxTransaction.Commit()
Catch ex As Exception
auxTransaction.Rollback()
Throw
End Try
End Using
Catch ex As Exception
Throw New CustomSqlException(auxConnection, ex)
End Try
End Using
При просмотре информации о трассировках SQL запрос имел статус «Прервано», поэтому ExecuteNonQuery
выдал исключение (может быть, Тайм-аут, но заняло 34 секунды, а время ожидания по умолчанию составляет 30 секунд), поэтому активирован Откат инструкции, но сгенерировал исключение, упомянутое ранее.
При просмотре информации о моем CustomSqlException
Соединение находилось в закрытом состоянии при попытке выполнить откат, но мой код не закрывает соединения явно, поэтому я не знаю, как было закрыто соединение.
Что еще я должен рассмотреть, чтобы понять эту проблему? Или какую информацию следует добавить в трассировку SQL / код VB, чтобы понять эту проблему в будущем?