ODP.NET トランザクション例
OracleTransactionオブジェクトを作成し、OracleConnectionオブジェクトのBeginTransaction メソッドを呼び出してトランザクションを開始します。
サンプル

EMP表を更新します。正常に更新が終了した場合、トランザクションをコミットします。
ENAMEはサイズ10で、10文字以上入れるとエラーとなり、トランザクションをロールバックします。
(エラー時)

Imports Oracle.DataAccess.Client
Public Class frmTransaction
Private Const ConnectionString As String = "DATA SOURCE=ORCL;User ID=scott;password=tiger;"
Private dt As DataTable = Nothing
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Const cmdSelect As String = "select EMPNO,ENAME from EMP order by EMPNO"
Using da As New OracleDataAdapter(cmdSelect, ConnectionString)
dt = New DataTable
da.Fill(dt)
Me.C1TrueDBGrid1.DataSource = dt
End Using
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim No1_No As Integer = CInt(TextEMPNO1.Text)
Dim No1_Name As String = TextENAME1.Text
Dim No2_No As Integer = CInt(TextEMPNO2.Text)
Dim No2_Name As String = TextENAME2.Text
UpdateData(No1_No, No1_Name, No2_No, No2_Name)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
End Sub
'''
''' EMP表の更新
'''
''' 更新1 EMPNO
''' 更新1 ENAME
''' 更新2 EMPNO
''' 更新2 ENAME
'''
Private Sub UpdateData(ByVal No1_No As Integer, ByVal No1_Name As String, ByVal No2_No As Integer, ByVal No2_Name As String)
Const cmdUpdate As String = "update emp set ename=:ENAME where empno=:EMPNO"
Dim cn As OracleConnection = Nothing
Dim trn As OracleTransaction = Nothing
Try
cn = New OracleConnection(ConnectionString)
'接続を開く
cn.Open()
'トランザクション開始
trn = cn.BeginTransaction
Using cmd As New OracleCommand(cmdUpdate, cn)
'更新1
cmd.BindByName = True
cmd.Parameters.Add("ENAME", OracleDbType.Varchar2).Value = No1_Name
cmd.Parameters.Add("EMPNO", OracleDbType.Int32).Value = No1_No
cmd.ExecuteNonQuery()
'更新2
cmd.Parameters.Item("ENAME").Value = No2_Name
cmd.Parameters.Item("EMPNO").Value = No2_No
cmd.ExecuteNonQuery()
End Using
'コミット
trn.Commit()
MessageBox.Show("更新完了", "正常終了", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
If Not IsNothing(trn) Then
trn.Rollback()
End If
MessageBox.Show(ex.Message, "更新前の状態に戻しました", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
If Not IsNothing(trn) Then
trn.Dispose()
End If
If Not IsNothing(cn) Then
If Not (cn.State = ConnectionState.Closed) Then
cn.Close()
End If
cn.Dispose()
End If
End Try
End Sub
End Class
履歴
- 2011/09/05
- 公開