トランザクションって大事だね

Imports System.Data
Imports System.Data.SqlClient

Module Program
    Sub Main(args As String())
        Dim con As SqlConnection = Nothing
        Dim tran As SqlTransaction = Nothing

        Dim serverName As String = "NQQCREP039\SQLEXPRESS"  ' サーバー名

        Dim dbName As String = "mvc_sample" 'DB名

        Dim userId As String = "sa" '接続ユーザーID

        Dim password As String = "sqlserver" 'パスワード

        con = New SqlConnection()

        'テーブル作成
        Dim dt As New DataTable()
        dt.Columns.Add("id") '項目を追加
        dt.Columns.Add("user_id")
        dt.Columns.Add("password")
        dt.Columns.Add("user_name")
        dt.Columns.Add("del_flg")
        dt.Columns.Add("create_date")
        dt.Columns.Add("update_date")

        '10行追加(ループで追加)
        Dim row As DataRow
        For i = 0 To 10

            row = dt.NewRow

            row("id") = i + 2
            row("user_id") = "user" & i
            row("password") = "password"
            row("user_name") = "bulkUser" & i
            row("del_flg") = 0
            row("create_date") = Now
            row("update_date") = Now

            dt.Rows.Add(row)

        Next


        con.ConnectionString =
                "Data Source = " & serverName &
                ";Initial Catalog = " & dbName &
                ";User ID = " & userId &
                ";Password = " & password

        con.Open()

        'トランザクションの開始
        tran = con.BeginTransaction

        ' SQL実行するためのオブジェクト?
        Dim sqlCmd As SqlCommand
        sqlCmd = con.CreateCommand()

        ' トランザクションをすることを明示する
        sqlCmd.Transaction = tran

        Using bcCopy As SqlBulkCopy = New SqlBulkCopy(con, SqlBulkCopyOptions.Default, tran)

            Try
                ' blukCopy
                bcCopy.DestinationTableName = "dbo.users"   ' 更新したいDB
                bcCopy.WriteToServer(dt)                    ' 更新するDataTable
                Console.WriteLine("----- blukcopy 正常終了 -----------")

                ' 更新
                ' 先のBlukcopyで追加した一部のデータを更新する(今回はuser2のユーザー名をhogehogeに更新する)
                Dim Sql As String = "update users Set user_name = @USER_NAME where user_id = @ID"   ' SQL
                Console.WriteLine(Sql)
                Using cmd As New SqlCommand(Sql, con, tran)
                    cmd.Parameters.Add(New SqlParameter(
                        "@ID", SqlDbType.VarChar)).Value = "user2"
                    cmd.Parameters.Add(New SqlParameter(
                        "@USER_NAME", SqlDbType.VarChar)).Value = "hogehoge"

                    cmd.ExecuteNonQuery()
                End Using
                Console.WriteLine("----- 同一トランザクションで更新 正常終了 -----------")

                ' コミット
                tran.Commit()
                Console.WriteLine("コミット")

            Catch ex As Exception
                Console.WriteLine("Error! {0}", ex.Message)

                ' ロールバック
                tran.Rollback()
                Console.WriteLine("ロールバック")
            Finally
                ' コネクションが閉じられていないとき閉じる
                If Not con.State = ConnectionState.Closed Then
                    con.Close()
                End If

                ' リソースの開放
                tran.Dispose()
                con.Dispose()
            End Try
        End Using

    End Sub
End Module