Проект 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