0

以下のコードを参照してください。

    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 を選択しますか? つまり、更新をバッチとして発行します。

4

2 に答える 2