6.5 SQLの実行/INSERT、UPDATE系
 INSERT文やUPDATE文を実行したいときの方法です。これらを実行するときも、ADOオブジェクトのExecuteというメソッドで行います。

 なお、これらのSQL文を実行してもレコードセットは返ってきません。でも、追加(INSERT)時にプライマリキーが重複していたり、更新(UPDATE)で対象のレコードが無かったりしたときのエラー情報は返ってきます。
使用例
 INSERT文やUPDATE文を実行するときのExecuteの使い方です。例では、ORACLEの住所録テーブルというテーブルへ新しいレコードの追加を行っています。ちなみに、テーブルのレイアウトはAccessネタで使った住所録テーブルと同じです。詳しくは、Accessネタ住所録を作ってみようの2.住所録テーブルの作成を参照してください。

 UPDATE文やINSERT文の実行は、ココのネタ(Accessのところ)にある5.6 SQLを実行する1と同じなので、たぶん見当がつくでしょう。それよりも、ここでの目玉はSQLを実行したときに発生したエラーの処理と、トランザクションの開始、コミット、ロールバックを行っている部分です。

 まずSQLの実行エラー判定に関する大前提ですが、SQLを実行したときにエラーが発生するとVBS(WSH)のプログラムもエラーとして終了してしまいます。でも、さすがにそれではマズイので、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には、例えばORACLEだとORA-XXXXXというエラーコードの、XXXXXの部分が取得できます。

 ■VBScriptでの記述例
Option Explicit

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

Dim objADO
Dim strSQL

'ADOオブジェクトを作成します
Set objADO = CreateObject("ADODB.Connection")

'ADOを使いORACLEのDBを開きます
objADO.Open "Driver={Microsoft ODBC for Oracle};" & _
            "CONNECTSTRING=ADRSORA; UID=HAPPY; PWD=ISLAND;"

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

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

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

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

'ADOをクローズします
objADO.Close

'オブジェクトの破棄
Set objADO = Nothing

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

    Dim objErrItem

    Set objErrItem = objADO.Errors.Item(0)

    WScript.echo "Description=" & objErrItem.Description
    WScript.echo "HelpContext=" & objErrItem.HelpContext
    WScript.echo "HelpFile=" & objErrItem.HelpFile
    WScript.echo "NativeError=" & objErrItem.NativeError
    WScript.echo "Number=" & objErrItem.Number
    WScript.echo "Source=" & objErrItem.Source
    WScript.echo "SQLState=" & objErrItem.SQLState

    Set objErrItem = Nothing

End Sub

 ■JScript(JavaScript)での記述例
var strSQL;

//ADOオブジェクトを作成します
var objADO = new ActiveXObject("ADODB.Connection");

//ADOを使いORACLEのDBを開きます
objADO.Open("Driver={Microsoft ODBC for Oracle};" +
            "CONNECTSTRING=ADRSORA; UID=HAPPY; PWD=ISLAND;");

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

//Aトランザクションを開始します
objADO.BeginTrans();

try {
   //Bレコード追加のSQLを実行します
   objADO.Execute(strSQL);
   //DSQLが正常終了したら追加を反映します
   objADO.CommitTrans();
} catch(e) {
   //ESQLが異常終了したら追加の破棄とエラー内容の表示をします
   prcSqlError();
   objADO.RollbackTrans();
}

//ADOをクローズします
objADO.Close();

//オブジェクトの破棄
objADO = null;

//==============================================================
//= Fエラー時処理(例ではエラーの詳細を表示するだけ)
//==============================================================
function prcSqlError() {

    var objErrItem = objADO.Errors.Item(0);

    WScript.echo("Description=" + objErrItem.Description);
    WScript.echo("HelpContext=" + objErrItem.HelpContext);
    WScript.echo("HelpFile=" + objErrItem.HelpFile);
    WScript.echo("NativeError=" + objErrItem.NativeError);
    WScript.echo("Number=" + objErrItem.Number);
    WScript.echo("Source=" + objErrItem.Source);
    WScript.echo("SQLState=" + objErrItem.SQLState);

    objErrItem = null;

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