トランザクションって大事だね
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