業務で使用する場合、トランザクション制御ができないと困ることが多いです。
そこで、ADO接続でMySQLのテーブルを複数更新かけて
途中でエラーになった時のロールバック方法等の備忘録です。
'---- Dim gobjCon As New ADODB.Connection Dim objCmd As New ADODB.command '*** データベースを開く gobjCon.ConnectionString = conConnectStr gobjCon.Open '*** トランザクション開始 gobjCon.BeginTrans ' コマンド設定 objCmd.ActiveConnection = gobjCon '*** 出庫基本 strSql = "UPDATE d_ship_base SET" strSql = strSql & " cutoff_flag = " & C_フラグ_済 & "" strSql = strSql & " WHERE owner_crp_id = " & crpId & "" ' 対象取引先ID strSql = strSql & " AND inv_date BETWEEN '" & m_fromDate & "' AND '" & m_toDate & "'" objCmd.CommandText = strSql ' SQL実行 objCmd.Execute strSql = "INSERT INTO d_adjust( " strSql = strSql & " adj_no" strSql = strSql & " ,adj_note" '備考 strSql = strSql & " ,add_dt" '登録日時 strSql = strSql & ") " strSql = strSql & "VALUES ( " strSql = strSql & " '" & mstrAdjNo & "'" strSql = strSql & " ,'" & Nz(Me.txtNote.value) & "'" strSql = strSql & " ,'" & Now & "'" strSql = strSql & ") " objCmd.CommandText = strSql ' SQL実行 objCmd.Execute '*** コミット gobjCon.CommitTrans '*** 後処理 gobjCon.Close: Set gobjCon = Nothing
なお、insertやupdateを別メソッドにしてメイン処理の中で
チェック処理や複数のinsertやupdateのメソッドを呼んで制御する手法を好んで書いています。
例として
'*************************** ' 更新ボタン '*************************** Private Sub cmd更新_Click() Dim sMsg As String On Error GoTo Error '================= ' 入力チェック '================= If funCheckInput = False Then Exit Sub End If '================= ' 確認メッセージ '================= sMsg = "登録します。よろしいですか?" If MsgBox(sMsg, vbInformation + vbYesNo + vbDefaultButton2, C_MSG_TITLE) = vbNo Then Exit Sub End If '*** データベースを開く gobjCon.ConnectionString = conConnectStr gobjCon.Open '*** トランザクション開始 gobjCon.BeginTrans '================= ' MAIN処理 '================= ' 在庫調整データ追加 If funDAdjust_Insert() = False Then GoTo Error_Rollback End If ' 在庫更新 If funStock_Update(mstrAdjNo) = False Then GoTo Error_Rollback End If '*** コミット gobjCon.CommitTrans '*** 後処理 gobjCon.Close: Set gobjCon = Nothing '================= ' 終了メッセージ '================= MsgBox "登録処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE Exit Sub Error: MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, C_MSG_TITLE Error_Rollback: On Error Resume Next ' ロールバック gobjCon.RollbackTrans ' 後処理 gobjCon.Close: Set gobjCon = Nothing End Sub
こうするとロジックは物凄い見やすくなるし途中で修正が入っても大丈夫。
基本クエリは帳票でしか使用しませんので
モジュール内で検索すれば、途中でテーブル変更があったとかの場合にも
影響調査がしやすいです。
この場合は、gobjConをグローバル変数にします。
コメント