3.6 SQLの実行(更新、追加、削除等)
INSERT文やUPDATE文を実行したいときの方法です。これらを実行するときも、ADOコネクションオブジェクトのExecuteというメソッドで行います。

これらのSQL文を実行してもレコードセットは返ってきませんが、追加(INSERT)時にプライマリキーが重複していたり、SQL文に間違いがあったときのエラー情報はErrors.Item(n)というプロパティへ返ってきます。
使用例
INSERT文やUPDATE文を実行するときのExecuteの使い方です。例では、「住所録テーブル」というテーブルへ新しいレコードを追加しています。

まずSQLの実行エラー判定に関する大前提ですが、SQLを実行したときにエラーが発生するとその時点でプロシジャが終了してしまいます。さすがにそれではマズイので、On Error Resume Nextを入れています(@)。

次に、トランザクションの開始(A)です。ADOオブジェクトのBeginTransメソッドで行います。更新や追加や削除を行うときは付けておきましょう。これを行うと、トランザクションの終了(CommitTransRollbackTrans)を行うまで、使用中の(更新や追加をした)レコードを全て占有(排他ロック)することが出来ます。他のユーザやプログラムが更新や削除をしようとしても出来ません。ただし、参照(SELECT)だけは可能です。が、参照は更新前の内容となります。また、さらに便利なことに更新や追加や削除が仮で行われます。

ExecuteメソッドでSQLを実行(B)した後、Err.Numberプロパティで実行結果を判定(C)しています。0(ゼロ)なら正常終了、それ以外は何らかのエラーが発生しています。

SQLが正常終了した場合は、CommitTransを実行(D)し、追加や更新や削除(例では追加のみ)を反映します。反映後は占有(排他ロック)が解除され、他のユーザやプログラムが更新後の内容を参照したり、占有されていたレコードを別な更新などに使えるようになります。

SQLが異常終了した場合は、RollbackTransを実行(E)し、それまでに行った更新や追加や削除(例では1件の追加のみ)を取り消します。占有(排他ロック)も解除されます。

ところで、SQLが異常終了したときに呼び出しているprcSqlError(F)ですが、ここはエラーが発生したときにどんな情報が取れるかということを表す為の処理なので、エラー情報を表示する以外何もしてません(笑)。わりとよく使う物は、エラーメッセージがDescription、SQLコードがNativeErrorぐらいでしょうか。

NativeErrorには、SQLの実行結果コードが入ります。ちなみにORACLEだと、ORA-XXXXXというエラーコードのXXXXXの部分が取得できます。

Sub prcTransactions()

    'Access VBA Tips
    '3.6 SQLの実行(更新、追加、削除等)

    '@SQLエラーでプログラムが異常終了するのを回避するため
    On Error Resume Next

    Dim adoCON As ADODB.Connection
    Dim strSQL As String

    'データベースのオープン(データベースオブジェクトの作成)
    Set adoCON = Application.CurrentProject.Connection

    'レコード追加のSQLを定義
    strSQL = "INSERT INTO 住所録テーブル " & _
             "       (レコードキー " & _
             "       ,漢字氏名 " & _
             "       ,カナ氏名 " & _
             "       ,性別) " & _
             "VALUES (1 " & _
             "       ,'埼京線之介' " & _
             "       ,'サイキョウセンノスケ' " & _
             "       ,1) "

    'Aトランザクションを開始します
    adoCON.BeginTrans

    'Bレコード追加のSQLを実行します
    adoCON.Execute strSQL

    'CSQL実行結果の判定
    If Err.Number = 0 Then
       'DSQLが正常終了したら追加を反映します
       adoCON.CommitTrans
    Else
       'ESQLが異常終了したら追加の破棄とエラー内容の表示をします
       Call prcSqlError(adoCON)
       adoCON.RollbackTrans
    End If

    'データベースのクローズ
    adoCON.Close

    'オブジェクト変数のクリア
    Set adoCON = Nothing

End Sub

'==============================================================
'= Fエラー時処理(例ではエラーの詳細を表示するだけ)
'==============================================================
Sub prcSqlError(tmpCon As ADODB.Connection)

    Dim objErrItem As Error

    Set objErrItem = tmpCon.Errors.Item(0)

    Debug.Print "Description=" & objErrItem.Description
    Debug.Print "HelpContext=" & objErrItem.HelpContext
    Debug.Print "HelpFile=" & objErrItem.HelpFile
    Debug.Print "NativeError=" & objErrItem.NativeError
    Debug.Print "Number=" & objErrItem.Number
    Debug.Print "Source=" & objErrItem.Source
    Debug.Print "SQLState=" & objErrItem.SQLState

End Sub
Copyright(C) 1999-2006 結城圭介。 All rights reserved