Windows Scripting Host 8

DAO

DAO(Data Access Object)はデータベースの操作をパッケージ化して 使いやすくしたものです。

DAOの階層構造

ADOのと同じように操作できますが、 それよりも深い階層構造になっています。 ADOのときはTDCからいきなりレコードセットオブジェクトが得られましたが、 DAOでは次のような階層構造になっています。
    DBEngine - Workspace - Database - Recordset
Microsoft Access Databaseからレコードセットオブジェクトを得るには 次のようにします。
    var DBEngine = WScript.CreateObject("DAO.DBEngine");
    var ws = DBEngine.Workspaces(0);
    var dbase = ws.OpenDatabase("score.mdb");
    var rs = dbase.OpenRecordset("Score");
OpenDatabaseの引数はデータベース名を、 OpenRecordsetはテーブル名を指定します。

うちの環境では次のようにしなければならなくなりました(1/5/02)。

    var DBEngine = WScript.CreateObject("DAO.DBEngine.36");
レジストリエディタでHKEY_CLASSES_ROOT\DAO.DBEngine辺りを見てください。

適当にデータベースにアクセスしてみましょう。 データベースの例はTDCの最初のものを MDBにしたものです。

score.lzh(score.mdbをLHAで圧縮したもの 8kB)

scripts/score.js
-------------------------------------------------------------
var DBEngine = WScript.CreateObject("DAO.DBEngine");
var dbase = DBEngine.Workspaces(0).OpenDatabase("score.mdb");
var rs = dbase.OpenRecordset("Score");

var allscore = 0;
while(!rs.EOF) {                //全てのレコードについて操作
    allscore += rs.Fields("算数").Value;
    rs.MoveNext();              //次のレコードへ
}

rs.Close();
dbase.Close();

WScript.Echo(allscore);
各人の算数の点数の合計を表示しています。
Fields("算数")として現在のレコードの算数フィールドの 値を得ます。 そして、MoveNextメソッドで次のレコードに移動します。 EOFプロパティで、 現在の位置が最後のレコードより後かどうかを判定します。

SQL

さきほどの例は次のようにしてSQL文を使うと簡単に書けます。
scripts/score2.js
-------------------------------------------------------------
var DBEngine = WScript.CreateObject("DAO.DBEngine");
var dbase = DBEngine.Workspaces(0).OpenDatabase("score.mdb");
var rs = dbase.OpenRecordset(
        "SELECT Sum(算数) AS 総得点 FROM Score");

WScript.Echo(rs.Fields("総得点").Value);

rs.Close();
dbase.Close();
OpenRecordsetメソッドで、 さきほどはテーブル名を引数にしていましたが、 SQL文を指定して実行することができます。

その他データベースへのアクセス

次のように例えばExcelのワークシートにアクセスすることができます。
score.xls(14kB)

scripts/score3.js
---------------------------------------------------------
var DBEngine = WScript.CreateObject("DAO.DBEngine");
var dbase = DBEngine.Workspaces(0).OpenDatabase(
                "score.xls", false, false, "EXCEL 5.0;");
var rs = dbase.OpenRecordset("Score$");

WScript.Echo(rs.Fields("算数").Value);

rs.Close();
dbase.Close();
OpenRecordsetメソッドで、 ワークシート名を指定しています。

ExcelでSQLを使う

Excelのワークシートをテーブル名にする方法が分かりました(1/5/02)。
次のように指定します。
    [sheetname$]
先ほどのAccessでSQLを使ったのと同じことができます。
scripts/score4.js
---------------------------------------------------------
var DBEngine = WScript.CreateObject("DAO.DBEngine.36");
var dbase = DBEngine.Workspaces(0).OpenDatabase(
                "score.xls", false, false, "EXCEL 5.0;");
var rs = dbase.OpenRecordset("SELECT Sum(算数) AS 総得点 FROM [Score$]");

WScript.Echo(rs.Fields("総得点").Value);

rs.Close();
dbase.Close();
シートの範囲に名前をつけておくとSQLのテーブルとして使えるのですが、 これをいちいち設定しなければならないのはどうかと思うので。

Nifty Manager

ほとんどの人には関係無いかと思いますが、 私がDAOを使おうと思ったきっかけはNifty Managerです。 Nifty Managerには利点もあるのですが、 普通の通信ソフトのようにテキストのログを残せないのが最大の欠点です。 ダウンロードしたデータは全て、MDBの形式のデータベースに登録されます。 そこで、ここからフォーラムを巡回したデータを読み取って 必要なデータをテキストデータにしましょう。
scripts/niftyman.js
---------------------------------------------------------
var DBEngine = WScript.CreateObject("DAO.DBEngine");
var dbase = DBEngine.Workspaces(0).OpenDatabase(
        "C:\\Program Files\\NIFTY\\Database\\CabData.MDB");

//SQL文
var rsData = dbase.OpenRecordset(
    "SELECT EcMsgTBL.*, EcMapTBL.*, EcRoomTBL.*, ForumTBL.* "
    + "FROM EcMsgTBL, EcMapTBL, EcRoomTBL, ForumTBL "
    + "WHERE EcMsgTBL.MessageDataNo = EcMapTBL.MessageDataNo"
    + " And EcMapTBL.RoomInfoNo = EcRoomTBL.RoomInfoNo"
    + " And EcRoomTBL.ForumInfoNo = ForumTBL.ForumInfoNo");

//必要な項目を全て表示
with(rsData) {
    while(!EOF) {
        WScript.Echo(Fields("GoCommand").Value);
        WScript.Echo(Fields("RoomNo").Value);
        WScript.Echo(Fields("MessageNo").Value);
        WScript.Echo(Fields("DataTime").Value);
        WScript.Echo(Fields("UserID").Value);
        WScript.Echo(Fields("UserName").Value);
        WScript.Echo(Fields("MessageTitle").Value);
        WScript.Echo(Fields("ParentMessageNo").Value);
        WScript.Echo(Fields("TextData").Value);
        MoveNext();
    }
}

rsData.Close();
dbase.Close();
4つのテーブルを結合して、フィールド名通りのデータを表示します。 本当にエッセンスしか書いていませんが、 これを元に使えるスクリプトを作ってみてください。 これですと、ログカッティングする必要もありませんしね。

DAO、SQLについてはMS-Accessのヘルプなどをごらんください。


first, prev, next, noframe, exit
Written 8/7/98