以下のコードを参照してください。
Imports System.Transactions
Imports System.Data.SqlClient
Imports System.Web.Configuration
Partial Class _Default
Inherits System.Web.UI.Page
Private _ConString As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
Dim objDR As SqlDataReader
_ConString = WebConfigurationManager.ConnectionStrings("TestConnection").ConnectionString
Dim objCon As New SqlConnection(_ConString)
Dim objCommand As New SqlCommand
objCommand.CommandText = "SELECT * FROM Person"
'Using scope As New TransactionScope()
objCon.Open()
Using scope As New TransactionScope()
objCommand.Connection = objCon
objDR = objCommand.ExecuteReader
Do While objDR.Read
Dim i As String = objDR("id2")
Dim objCommand2 As New SqlCommand
objCommand2.Connection = objCon
objCommand2.CommandText = "UPDATE Person SET URN=1 WHERE id2 = '" & i & "'"
objCommand2.ExecuteNonQuery() 'line 28
objCommand2.CommandText = "UPDATE Person SET URN=2 WHERE id2 = '" & i & "'"
objCommand2.ExecuteNonQuery() 'line 30
objCommand2.CommandText = "UPDATE Person SET URN=3 WHERE id2 = '" & i & "'"
objCommand2.ExecuteNonQuery() 'line 32
Loop
'scope.Complete() 'line 34
End Using
objDR.Close()
Catch ex As Exception
Throw
End Try
End Sub
End Class
scope.complete がコメントアウトされていても、3 つの update ステートメントが実行されます。これは、接続が TransactionScope の外で開かれているためだと思います。
これらの更新を発行するために 100 万人をループしたい場合は、次の 2 つのオプションがあります。
1) すべての更新を行い、最後に変更をデータベースにコミットします。2) ループごとに変更をコミットします。その後、ループごとに新しい接続を開く必要があります。
開発者は常にオプション 1 を選択しますか? つまり、更新をバッチとして発行します。