JScriptからODBC ドライバ経由でのデータベース接続 その２

## 準備

SQL文を実行してみます。
まず、以下の様なデータベースとテーブルを作成します。

データベース名：testdb
テーブル名：testtable

|列名|データ型|
|:---|:---|
|num|int|
|str|varchar(50)|
|date|datetime|

また、共通関数を用意します。

```js
var driver = "{SQL Server}";          // ODBCドライバ
var server = "localhost\\SQLEXPRESS"; // サーバ
var database = "testdb";              // データベース
var user = "sa";                      // ユーザ
var pass = "*****";                   // パスワード

/**
 * 「Connection」接続
 */
function openConnection() {
    // 「Connection」オブジェクト生成
    var con = new ActiveXObject("ADODB.Connection");
    // 接続文字列設定
    con.ConnectionString = "Provider=MSDASQL" // プロバイダ
        + ";DRIVER=" + driver                 // ODBCドライバ
        + ";SERVER=" + server                 // サーバ
        + ";DATABASE=" + database             // データベース
        + ";UID=" + user                      // ユーザ
        + ";PWD=" + pass;                     // パスワード
    // 接続
    con.Open();
    return con;
}

/**
 * 「Connection」切断
 */
function closeConnection(con) {
    try {
        // ステータスチェック
        if (con && con.State == 1) {
            // 切断
            con.Close();
        }
    } catch (e) {
        // エラーの場合
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
}

/**
 * 日付フォーマット
 */
function df(date) {
    var ret = null;
    if (date && date instanceof Date) {
        ret = date.getFullYear() + "-"
            + ("0" + (date.getMonth() + 1)).slice(-2) + "-"
            + ("0" + date.getDate()).slice(-2) + " "
            + ("0" + date.getHours()).slice(-2) + ":"
            + ("0" + date.getMinutes()).slice(-2) + ":"
            + ("0" + date.getSeconds()).slice(-2);
    }
    return ret;
}
```

## SELECT

「SELECT」文のサンプルです。
SQLインジェクション対策用に、「ADODB.Command」を利用してパラメータを設定しています。

```js
// 「Connection」オブジェクト用変数
var con = null;
// 「Recordset」オブジェクト用変数
var rs = null;
try {
    // 接続
    con = openConnection();
    // 「Command」オブジェクト生成
    var cmd = new ActiveXObject("ADODB.Command");
    // 「Connection」オブジェクト設定
    cmd.ActiveConnection = con;
    // コマンドタイプをテキスト(1)に設定
    cmd.CommandType = 1;
    // 「Prepared」を真に設定
    cmd.Prepared = true;
    // 発行するコマンド文字列(SQL文)を設定 
    cmd.CommandText = "SELECT * FROM testtable WHERE num > ?";
    // パラメータを設定
    cmd.Parameters(0).Value = 0;
    // 実行
    rs = cmd.Execute();
    // 行番号
    var row = 1;
    // 「Recordset」が最後になるまでループ
    while (!rs.EOF) {
        // １行文字列
        var line = "" + row++;
        // フィールド数分ループ
        for (var i = 0; i < rs.Fields.Count; i++) {
            // フィールドの値、null判定
            if (rs.Fields(i).Value != null) {
                // フィールドタイプ判定
                if (rs.Fields(i).Type == 135) {
                    // 「日付/時刻スタンプ」型だったので、日付フォーマット
                    line += " " + df(new Date(rs.Fields(i).Value));
                } else {
                    // 「日付/時刻スタンプ」型以外だったので、そのまま
                    line += " " + rs.Fields(i).Value;
                }
            } else {
                // nullだったので、そのまま
                line += " " + rs.Fields(i).Value;
            }
        }
        // １行分出力
        WScript.Echo(line);
        // 次の行へ移動
        rs.MoveNext();
    }
} catch (e) {
    // エラーの場合
    WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
} finally {
    try {
        // ステータスチェック
        if (rs && rs.State == 1) {
            // 「Recordset」を閉じる
            rs.Close();
        }
    } catch (e) {
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
    // 「Connection」切断
    closeConnection(con);
}
```

## INSERT

「INSERT」文のサンプルです。
「SELECT」文のサンプルと同様に、「SQLインジェクション対策」をしています。
また、トランザクションによる制御も入れています。

```js
// 「Connection」オブジェクト用変数
var con = null;
try {
    // 接続
    con = openConnection();
    // トランザクション開始
    con.BeginTrans();
    // 「Command」オブジェクト生成
    var cmd = new ActiveXObject("ADODB.Command");
    // 「Connection」オブジェクト設定
    cmd.ActiveConnection = con;
    // コマンドタイプをテキスト(1)に設定
    cmd.CommandType = 1;
    // 「Prepared」を真に設定
    cmd.Prepared = true;
    // 発行するコマンド文字列(SQL文)を設定 
    cmd.CommandText = "INSERT INTO testtable (num, str, date) VALUES (?, ?, GETDATE());";
    // パラメータ設定
    cmd.Parameters(0).Value = 100;
    cmd.Parameters(1).Value = "string";
    // 実行
    cmd.Execute();
    // トランザクション、コミット
    con.CommitTrans();
} catch (e) {
    // エラーの場合
    WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    try {
        // トランザクション、ロールバック
        con.RollbackTrans();
    } catch (e) {
        // エラーの場合
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
} finally {
    // 「Connection」切断
    closeConnection(con);
}
```

## UPDATE

「UPDATE」文のサンプルです。
「INSERT」文のサンプルと同様に、「SQLインジェクション対策」「トランザクション」をしています。

```js
// 「Connection」オブジェクト用変数
var con = null;
try {
    // 接続
    con = openConnection();
    // トランザクション開始
    con.BeginTrans();
    // 「Command」オブジェクト生成
    var cmd = new ActiveXObject("ADODB.Command");
    // 「Connection」オブジェクト設定
    cmd.ActiveConnection = con;
    // コマンドタイプをテキスト(1)に設定
    cmd.CommandType = 1;
    // 「Prepared」を真に設定
    cmd.Prepared = true;
    // 発行するコマンド文字列(SQL文)を設定 
    cmd.CommandText = "UPDATE testtable SET date = ? WHERE num = ?;";
    // パラメータ設定
    cmd.Parameters(0).Value = df(new Date(new Date().getTime() - 3600000));
    cmd.Parameters(1).Value = 100;
    // 実行
    cmd.Execute();
    // トランザクション、コミット
    con.CommitTrans();
} catch (e) {
    // エラーの場合
    WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    try {
        // トランザクション、ロールバック
        con.RollbackTrans();
    } catch (e) {
        // エラーの場合
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
} finally {
    // 「Connection」切断
    closeConnection(con);
}
```


## DELETE

「DELETE」文のサンプルです。
「INSERT」文のサンプルと同様に、「SQLインジェクション対策」「トランザクション」をしています。

```js
// 「Connection」オブジェクト用変数
var con = null;
try {
    // 接続
    con = openConnection();
    // トランザクション開始
    con.BeginTrans();
    // 「Command」オブジェクト生成
    var cmd = new ActiveXObject("ADODB.Command");
    // 「Connection」オブジェクト設定
    cmd.ActiveConnection = con;
    // コマンドタイプをテキスト(1)に設定
    cmd.CommandType = 1;
    // 「Prepared」を真に設定
    cmd.Prepared = true;
    // 発行するコマンド文字列(SQL文)を設定 
    cmd.CommandText = "DELETE FROM testtable WHERE num = ?;";
    // パラメータ設定
    cmd.Parameters(0).Value = 100;
    // 実行
    cmd.Execute();
    // トランザクション、コミット
    con.CommitTrans();
} catch (e) {
    // エラーの場合
    WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    try {
        // トランザクション、ロールバック
        con.RollbackTrans();
    } catch (e) {
        // エラーの場合
        WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
    }
} finally {
    // 「Connection」切断
    closeConnection(con);
}
```