Проект Visual Basic Command Window
'Данные примеры кода создаются в контексте проекта Visual Basic Command 'Window. Чтобы запустить приведенный образец кода, нужно создать в Visual Studio
'новый проект Command Window и добавить в него ссылки, содержащиеся в 
'показанных ниже операторах Imports. Затем следует скопировать и вставить 
'в исходный файл Module1.vb содержащийся здесь код.
'(Учтите, что наличие символов принудительного переноса текста 
'на следующую строку в сочетании с режимом автопереноса может стать причиной ошибок в процессе копирования.)
Imports System.Transactions
Imports System.Data.SqlClient
Module Module1
    Sub Main()
        'Нужно снять символ комментария со следующей строки, чтобы
        'поставить My.User в соответствие с локально зарегистрировавшимся
         в системе пользователем
        ' My.User.InitializeWithWindowsUser
BEGIN CALLOUT A
        Dim myTran As New System.Transactions.CommittableTransaction()
        Dim myConn As New System.Data.SqlClient.SqlConnection
		("server=(local);database=AdventureWorks;Integrated Security=true")
        Try
            Dim myCommand As SqlCommand = myConn.CreateCommand()
            myCommand.CommandText = "usp_Product_SelectPrice"
            myCommand.CommandType = CommandType.StoredProcedure
            Dim updateCommand4 As SqlCommand = myConn.CreateCommand()
            myConn.Open()
            myConn.EnlistTransaction(myTran)
            Dim myReader As SqlDataReader = myCommand.ExecuteReader()
            'Loop through each item in the reader and increase the price by 20% + $1.00
            While myReader.Read()
                DoCommand(updateCommand4, myReader.GetInt32(0),  _
				(myReader.GetSqlMoney(1) * 0.2) + 1)
            End While
            myReader.Close()
            myTran.Commit()
        Catch ex As Exception
            ' An error means the transaction can't commit
            myTran.Rollback()
        Finally
            myConn.Close()
        End Try
END CALLOUT A
BEGIN CALLOUT B
        Dim myCommitableTran As New System.Transactions.CommittableTransaction()
        Dim myConnection As New 
System.Data.SqlClient.SqlConnection("server=(local);database=AdventureWorks;Integrated 
Security=true")
        Try
            myConnection.Open()
            myConnection.EnlistTransaction(myCommitableTran)
            Dim updateCommand As SqlCommand = myConnection.CreateCommand()
            DoCommand(updateCommand, 444, 0.54)
            myCommitableTran.Commit()
        Catch ex As Exception
           'Ошибка указывает на невозможность завершения транзакции
            myCommitableTran.Rollback()
        Finally
            myConnection.Close()
        End Try
END CALLOUT B
BEGIN CALLOUT C
        Using myTranScope As New System.Transactions.TransactionScope()
            Dim myConnection2 As New System.Data.SqlClient.SqlConnection
			("server=(local);database=AdventureWorks;Integrated Security=true")
            'Dim myConnection3 As New System.Data.SqlClient.SqlConnection
			("server=;database=AdventureWorks;Integrated Security=true")
            Try
                Dim updateCommand2 As SqlCommand = myConnection2.CreateCommand()
                myConnection2.Open()
                DoCommand(updateCommand2, 444, 1.05)
                'Dim updateCommand3 As SqlCommand = myConnection3.CreateCommand()
                'DoCommand(updateCommand3, 445, 1.04)
                myTranScope.Complete()
            Catch ex As Exception
           'Ошибка указывает на невозможность завершения транзакции
                myTranScope.Dispose()
            Finally
                myConnection2.Close()
                'myConnection3.Close()
            End Try
        End Using
END CALLOUT C
    End Sub
    Sub DoCommand(ByVal updateCommand As SqlCommand, ByVal productID As Integer, 
ByVal price As Double)
	  ' неэффективно, но в данном примере позволяет сократить объем повторяющегося кода
        updateCommand.CommandText = "usp_Product_UpdatePrice"
        updateCommand.CommandType = CommandType.StoredProcedure
        updateCommand.Parameters.Clear()
        Dim productIDParameter As New SqlParameter("@ProductID", SqlDbType.Int)
        updateCommand.Parameters.Add(productIDParameter)
        Dim listPriceParameter As New SqlParameter("@ListPrice", SqlDbType.Money)
        updateCommand.Parameters.Add(listPriceParameter)
        productIDParameter.Value = productID
        listPriceParameter.Value = price
        updateCommand.ExecuteNonQuery()    End Sub
End Module