8.4 データ追加、更新
ADOを使って開いたワークシートやCSVファイルに変更を加える方法です。これらも、ADOオブジェクトのExecuteというメソッドでSQLを実行し行います。

なお、更新系のSQL文を実行してもレコードセットは返ってきません。また、オープン時は必ず更新モード(ReadOnly=0)を指定する必要があります。

それと、それと少しだけRDBとの違いがあるのも注意が必要。トランザクション処理が出来ない点、INSERT時はプライマリ重複エラーがない点です。

また、ワークシートでは追加(INSERT)と更新(UPDATE)が可能、CSVでは追加(INSERT)のみが可能という制約もあります。
使用例/CSVファイルの場合
CSVファイルは、データの追加(INSERT)のみが可能です。例では、c:\happyというフォルダに入っているADO_EXCEL.csvというCSVファイルへレコードを追加しています。やってることは、かなりムリヤリで実用的じゃないですが、まぁ気にしないでくださいな(汗)

CSVファイルの場合は追加時にキー重複エラーが発生することはありませんが、一応On Error Resume Nextを入れ、更新の後にエラー判定処理を行っています。

なお、基本的には『6.5 SQLの実行/INSERT、UPDATE系』と似ています。SQLの実行方法やエラー情報の取得方法は、そちらを参照してください。大きな違いは、トランザクション処理を行っていない(出来ない)点です。

 ■VBScriptでの記述例
Option Explicit

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

Dim objADO
Dim strSQL

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

'ADOを使い更新モードでCSVファイルを扱う準備(Open)を行います。
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _
             "DBQ=c:\happy;" & _
             "ReadOnly=0"

'==============================================================
'= データ追加の例
'==============================================================
'レコード追加のSQLを定義
strSQL = "INSERT INTO ADO_EXCEL.csv " & _
         "       (日付 " & _
         "       ,店舗コード) " & _
         "VALUES ('2003/11/30' " & _
         "       ,'T5130') "

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

'SQL実行結果の判定
If Err.Number <> 0 Then
   'SQLが異常終了したらエラー内容の表示をします
   Call prcSqlError
End If

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

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

'==============================================================
'= エラー時処理(例ではエラーの詳細を表示するだけ)
'==============================================================
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を使い更新モードでCSVファイルを扱う準備(Open)を行います。
objADO.Open("Driver={Microsoft Text Driver (*.txt; *.csv)}; " +
             "DBQ=c:\\happy;" +
             "ReadOnly=0");

//==============================================================
//= データ追加の例
//==============================================================
//レコード追加のSQLを定義
strSQL = "INSERT INTO ADO_EXCEL.csv " +
         "       (日付 " +
         "       ,店舗コード) " +
         "VALUES ('2003/11/30' " +
         "       ,'T5130')";

try {
   //レコード追加のSQLを実行します
   objADO.Execute(strSQL);
} catch(e) {
   //SQLが異常終了したらエラー内容の表示をします
   prcSqlError();
}

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

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

//==============================================================
//= エラー時処理(例ではエラーの詳細を表示するだけ)
//==============================================================
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;

}
使用例/エクセルファイルの場合
ワークシートは、データの追加(INSERT)と更新(UPDATE)が可能です。例では、c:\happy\ADO_EXCEL.xlsというワークブックを開き、ワークシートへレコードの追加とレコードの更新を行っています。これも、かなりムリヤリで実用的じゃないですが、まぁ気にしないでくださいな(汗)

ワークシートの場合も追加時のキー重複エラーが発生することはありませんが、一応On Error Resume Nextを入れ、更新の後にエラー判定処理を行っています。

なお、基本的には『6.5 SQLの実行/INSERT、UPDATE系』と似ています。SQLの実行方法やエラー情報の取得方法は、そちらを参照してください。大きな違いは、トランザクション処理を行っていない(出来ない)点です。

 ■VBScriptでの記述例
Option Explicit

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

Dim objADO
Dim strSQL

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

'ADOを使いエクセルファイルを更新モードで開きます。
objADO.Open "Driver={Microsoft Excel Driver (*.xls)}; " & _
             "DBQ=c:\happy\ADO_EXCEL.xls;" & _
             "ReadOnly=0"
'==============================================================
'= データ追加の例
'==============================================================
'レコード追加のSQLを定義
strSQL = "INSERT INTO U_TBL " & _
         "       (日付 " & _
         "       ,店舗コード) " & _
         "VALUES ('2003/11/30' " & _
         "       ,'Z5130') "

'レコード追加のSQLを2回実行します。
'(エクセルファイルなのでキー重複エラーは出ません)
'追加したデータが、更新時の対象データになります。
objADO.Execute strSQL
objADO.Execute strSQL

'レコード更新のSQLを定義
strSQL = "UPDATE U_TBL " & _
         "   SET データ番号 = '100'" & _
         "      ,担当者 = '00M5365'" & _
         "      ,会員番号 = '5144M200210724'" & _
         " WHERE 店舗コード='Z5130'"

'レコード更新のSQLを実行します。(事前に対象データを2件追加しています)
objADO.Execute strSQL

'SQL実行結果の判定
If Err.Number <> 0 Then
   'SQLが異常終了したらエラー内容の表示をします
   Call prcSqlError
End If

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

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

'==============================================================
'= エラー時処理(例ではエラーの詳細を表示するだけ)
'==============================================================
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

 ■VBScriptでの記述例
var strSQL

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

//ADOを使いエクセルファイルを更新モードで開きます。
objADO.Open("Driver={Microsoft Excel Driver (*.xls)}; " +
             "DBQ=c:\\happy\\ADO_EXCEL.xls;" +
             "ReadOnly=0");
//==============================================================
//= データ追加の例
//==============================================================
//レコード追加のSQLを定義
strSQL = "INSERT INTO U_TBL " +
         "       (日付 " +
         "       ,店舗コード) " +
         "VALUES ('2003/11/30' " +
         "       ,'Z5130') ";

//レコード追加のSQLを2回実行します。
//(エクセルファイルなのでキー重複エラーは出ません)
//追加したデータが、更新時の対象データになります。
objADO.Execute(strSQL);
objADO.Execute(strSQL);

//レコード更新のSQLを定義
strSQL = "UPDATE U_TBL " +
         "   SET データ番号 = '100'" +
         "      ,担当者 = '00M5365'" +
         "      ,会員番号 = '5144M200210724'" +
         " WHERE 店舗コード='Z5130'";

//レコード更新のSQLを実行します。(事前に対象データを2件追加しています)
try {
   objADO.Execute(strSQL);
} catch(e) {
   //SQLが異常終了したらエラー内容の表示をします
   prcSqlError();
}

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

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

//==============================================================
//= エラー時処理(例ではエラーの詳細を表示するだけ)
//==============================================================
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