LoginSignup
11
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-01

準備

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

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

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

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

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」を利用してパラメータを設定しています。

// 「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) {
        // 1行文字列
        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;
            }
        }
        // 1行分出力
        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インジェクション対策」をしています。
また、トランザクションによる制御も入れています。

// 「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インジェクション対策」「トランザクション」をしています。

// 「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インジェクション対策」「トランザクション」をしています。

// 「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);
}
11
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
14