ハードなソフトの話

アクセスカウンタ

zoom RSS コマンドラインからMDB/ACCDBファイルのデータをSQLで抽出する

<<   作成日時 : 2009/08/07 15:59   >>

ナイス ブログ気持玉 3 / トラックバック 2 / コメント 2

AccessとかインストールされていないPCでMDBファイルを読んだり操作したりすることが多いので、こんなスクリプト(jetsql.vbs)を書いてみた。
option explicit

const adStateClosed     = 0, adStateOpen      = 1
const adStateConnecting = 2, adStateExecuting = 4
const adStateFetching   = 8

class JetSql
    
    private m_cn, m_rs,m_cnopen
    
    private sub Class_Initialize()
        set m_rs = nothing
        set m_cn = createobject("ADODB.Connection")
        m_cnopen = false
    end sub

    private sub Class_Terminate()
        if m_cnopen            then m_cn.close
        if not m_cn is nothing then set m_cn = nothing
    end sub

    public sub execute(mdbfile,strSql)
        const adCmdText=1
        with m_cn
            mdbfile =trim(mdbfile)
            if right(mdbfile,4) = ".mdb" then
                .Provider = "Microsoft.Jet.OLEDB.4.0"
            end if
            if right(mdbfile,6) = ".accdb" then
                .Provider = "Microsoft.ACE.OLEDB.12.0"
            end if
            .Properties("Data Source") = mdbfile
        end with
        m_cn.open : m_cnopen = true
        dim cmd: set cmd = createobject("ADODB.Command")
        with cmd
            .ActiveConnection = m_cn
            .CommandText = strSql
            .CommandType = adCmdText
        end with
        set m_rs = cmd.execute
    end sub

    public sub export()
        if m_rs is nothing then exit sub
        if m_rs.state = adStateClosed then exit sub 
        dim strData,item
        strData =""
        for each item in m_rs.fields
            if len(strData) > 0 then strData = strData & vbTab
            strData = strData & item.name
        next
        wsh.echo strData
        do until m_rs.eof
            strData=""
            for each item in m_rs.fields
                if len(strData) > 0 then strData = strData & vbTab
                strData = strData & item.value
            next
            wsh.echo strData
            m_rs.movenext
        loop
    end sub
end class

dim arg,mdbfile,strSql,objSql
set arg = WScript.Arguments
mdbfile = arg(0)
strSql  = arg(1)
set objSql = new JetSql
objSql.execute mdbfile,strSql
objSql.export



使い方はこんな感じ:
cscript //nologo jetsql.vbs database.mdb "select * from table"

Access 2007 の accdbファイルにも対応してみた。
ただし、エンジンのインストールは必要。

参考: MSDN のADOのページ - http://msdn.microsoft.com/ja-jp/library/cc411360.aspx

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 3
ナイス ナイス ナイス

トラックバック(2件)

タイトル (本文) ブログ名/日時
コマンドラインからMDB/ACCDBファイルのテーブル一覧とカラム名一覧を表示する
前回「コマンドラインからMDB/ACCDBファイルのデータをSQLで抽出する」でデータの抽出ができるようになったけれど、テーブル名とかカラム名とかわからないとSQLが書けない。 そんなわけで、tablelist.vbsというスクリプトを書いてみた。 option&nbsp;explicit dim&nbsp;arg&nbsp;:&nbsp;set&nbsp;arg&nbsp;=&nbsp;WScript.Arguments if&nbsp;arg.count&nbsp;=&nbsp... ...続きを見る
ハードなソフトの話
2009/08/07 17:56
ウェブリブログを自力でアクセス解析(4)〜複数日分のデータをデータベースファイル化〜
1日分のログが入ったHTMLファイルをTSVに変換して統計を取ったところで、わかることは少ない。 そこで、日々のデータをMicrosoft Access用のファイルに出力することにした。 結果的に過去に書いたVBScriptよるデータベース操作用のスクリプトとHTMLファイルを解析してタブ区切りテキストにするPerlスクリプトをバッチファイルで制御で制御するという、昨日の晩御飯のオカズとか残りものでつくったんだけれど美味しいのかしらん?みたいな状態になった。 できあがったバッチファイ... ...続きを見る
ハードなソフトの話
2009/08/27 21:44

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(2件)

内 容 ニックネーム/日時
コードを参考にさせていただいています。
このやり方だとMDBの文字コードがUNICODEだった場合に、文字化けしてしまいます。
どうしたら良いでしょうか?
ご教示いただけるとうれしいです。
KIKU
2014/01/26 01:27
KIKUさん、
残念ながら文字化けの理由は私にもよくわかりません。
Access 2000以降のMDBファイルは常にUnicodeを使用しています。VBScriptでも内部コードにUnicodeを使用しています。しかし、コマンドウィンドウでリダイレクト出力されるときはShift-JISです。仮にリダイレクト出力をUnicodeにしたいのであれば、下記のように//UオプションでUnicodeへ変換することができます。

cscript //u jetsql.vbs mdbfile.mdb "select * from table" > Unicode.txt

MDBがAccess97以前のバージョンで作成されたものであれば、文字コードがShift-JISです。しかし、この方式では読み込みにエラーになるのではないかと思います。
にっく@ハードなソフトの話
2014/01/27 22:47

コメントする help

ニックネーム
本 文
コマンドラインからMDB/ACCDBファイルのデータをSQLで抽出する ハードなソフトの話/BIGLOBEウェブリブログ
文字サイズ:       閉じる