2010-09-14 4 views
0

Я создал форму окна в VB.NET и в событии click «Сохранить», я вызываю 5 процедур для выполнения различных задач. Все это в одном блоке TRY-CATCH. Проблема, с которой я сталкиваюсь, состоит в том, что из 5 процедур, которые вызывают, если есть ошибка при выполнении 4-й процедуры, данные, хранящиеся из 3 перед процедурами, будут существовать в таблицах.Начать переход в VB.NET

Может ли кто-нибудь помочь мне в том, как я могу использовать начало транса, переход на возврат и совершение транса в VB.NET.

С уважением,
Джордж

+0

Все ли 5 ​​процедур в этой базе данных? – InSane

ответ

1

Вы можете настроить ADO.Net, чтобы использовать транзакцию:

Dim conn As SqlConnection = New SqlConnection("connString") 
    Dim transaction As SqlTransaction = conn.BeginTransaction 

    conn.Open() 
    Try 
     'do all your work.... 

      transaction.Commit() 

    Catch ex As Exception 
     transaction.Rollback() 

    Finally 
     'clean up.... 
    End Try 
+0

+1 Мы также можем использовать TransactionScope :) –

+0

Уважаемый Klabranche, Спасибо за помощь. Я также слышал, что есть что-то под названием «Использование области». Может ли это также использоваться, и если ДА, может ли это быть в блоке try-catch. –

+0

Да, вы можете использовать его в блоке try-catch. – klabranche

1

Если все 5 процедур в той же базе данных, и нет связанных баз данных, вовлеченных: -

  1. Вы можете создать одну процедуру, которая вызывает все 5 процедур в правильной последовательности. В этой процедуре вы можете сделать BEGIN TRAN и COMMIT/ROLLBACK TRAN в начале и конце соответственно

  2. Если вы хотите сделать это с помощью ADO.net и до тех пор, пока все процедуры вызывают в том же соединении , вы можете связать сделку с командой obect и использовать его как в примере given here

Однако в случае, если вы разговариваете по нескольким базам данных,

  1. вам нужно будет использовать распределенный транзакции и TransactionScope. См. this link для получения более подробной информации и примера о том, как это сделать.
0

Я бы использовал объект TransactionScope и неявные транзакции. Таким образом, даже если вы перекрестите базы данных, все они будут работать сообща прозрачно. Ну, вам нужен DTC работает, если вы сделаете это ... но в любом случае, что-то вроде этого

Imports System.Transactions 

Using scope as new TransactionScope() 

    ' do all your work, here, then ... 

    ' Commit everything 
    scope.Complete() 
End Using 

Хорошая вещь здесь является то, что код, который делает фактическую работу не должны знать, что есть транзакция работает , и если есть исключение, он автоматически откатится с помощью блока «Использование».

+0

Уважаемый Крис, спасибо за информацию. Могу ли я использовать это с помощью области внутри блока try-catch. С уважением, Джордж –

+0

Да, вы можете. Или вы можете использовать try/catch/finally вместо используемого блока, если хотите, но я нахожу Использование более простым и понятным. –