トランザクション SqlTransaction VB.NET

      2017/07/13


トランザクションについて書こうと思います。

具体的な説明というと銀行の振り込みとかです。

まずはテーブル作成します。
口座テーブル
口座番号 口座名 預金残高

ここではトランザクションの説明がメインなので簡単な構成にしました。
銀行名や口座の種類や支店名や諸々はスルーしますw

仕様
口座データを読み込む。
預金残高が振り込み金額より多いか確認する。
少ないならエラー
金額を差し引いて更新。
口座に引いた分を足して入金する。

ソース
Imports System.Data.SqlClient
Public Class Form1
Dim cn As New SqlConnection(
"Data Source=(local)\SQL;" +
"Initial Catalog=ADO;" +
"Integrated Security=True;Pooling=False")
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim cmd As New SqlCommand("select * from 口座", cn)

Dim adapter As New SqlDataAdapter(cmd)
Dim table As New DataTable()
adapter.Fill(table)
DataGridView1.DataSource = table
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim cmd As New SqlCommand("Create Table 口座(口座番号 Char(8),口座名 Char(16),預金残高 int)", cn)

cn.Open()
cmd.ExecuteNonQuery()
cn.Close()
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim cmd As New SqlCommand("INSERT INTO 口座 (
口座番号,口座名,預金残高
)
VALUES
( @number,@name,@money
)", cn)
Dim name As String = TextBox2.Text
Dim number As String = TextBox1.Text
Dim money As String = TextBox3.Text

cmd.Parameters.Add(New SqlParameter("@name", name))
cmd.Parameters.Add(New SqlParameter("@number", number))
cmd.Parameters.Add(New SqlParameter("@money", money))

cn.Open()

cmd.ExecuteNonQuery()
cn.Close()

End Sub

Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click
Dim cmd As New SqlCommand("select 預金残高 from 口座 where 口座番号 = @number or 口座番号 = @number1 ", cn)

Dim name As String = TextBox2.Text
Dim number As String = TextBox1.Text
Dim number1 As String = TextBox4.Text
Dim money As String = TextBox3.Text
Dim money1 As Integer = 0
Dim money2 As Integer = 0
cmd.Parameters.Add(New SqlParameter("@number1", number1))
cmd.Parameters.Add(New SqlParameter("@number", number))
cmd.Parameters.Add(New SqlParameter("@money", money))

Dim adapter As New SqlDataAdapter(cmd)
Dim table As New DataTable()
adapter.Fill(table)

money1 = table.Rows(0).Item("預金残高")
money2 = table.Rows(1).Item("預金残高")

If CInt(TextBox3.Text) > money1 Then
MsgBox("残高が足りません")
End If
cn.Open()

Dim tran As SqlTransaction = cn.BeginTransaction

Try

money = money1 - CInt(TextBox3.Text)

Dim cmd1 As New SqlCommand("update 口座
set 預金残高 = @money
where 口座番号 = @number", cn)
cmd1.Parameters.Add(New SqlParameter("@number", number))
cmd1.Parameters.Add(New SqlParameter("@money", money))

cmd.Transaction = tran
cmd1.Transaction = tran

cmd1.ExecuteNonQuery()

money = 0

money = money2 + CInt(TextBox3.Text)
Dim cmd2 As New SqlCommand("update 口座
set 預金残高 = @money
where 口座番号 = @number1", cn)
cmd2.Parameters.Add(New SqlParameter("@number1", number1))
cmd2.Parameters.Add(New SqlParameter("@money", money))
cmd2.Transaction = tran

cmd2.ExecuteNonQuery()
tran.Commit()

Catch ex As Exception
tran.Rollback()

End Try
cn.Close()
End Sub
End Class

動作
ボタン1を押すとデータ表示
ボタン2を押すとテーブル作成
ボタン3を押すとデータ作成
口座番号 TextBox1.Text
口座名 TextBox2.Text
預金残高 TextBox3.Text
を入力してください。
1 佐藤 10000
2 中田 10000

ボタン4を押すと口座番号1からお金が減り口座番号2からお金が増える。
条件
TextBox1.Textに振り込み者口座 1
TextBox4.Textに振込先口座 2
TextBox3.Textに振込金額

ボタン1を押して確認する。

それではトランザクションの説明です。
Dim tran As SqlTransaction = cn.BeginTransaction
トランザクションを開始。

cmd.Transaction = tran
cmd1.Transaction = tran

コマンドにトランザクションを設定

tran.Commit()
データベースに反映する。
Commitを忘れると反映されないので注意

tran.Rollback()
キャンセル

簡単ですね。

ここでは同じデータベース上にデータがあるという都合のいい設定ですw
銀行系の仕様書は見たこともないので詳しい仕様は知りません。
今回はado.netのトランザクションなのでこのような形になりました。
本来はストアドプロシージャを使用してする方法が王道だとは思います。

PR



 - ADO.NET

Translate »