準備
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);
}