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

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

ナイス ナイス ナイス

この記事へのコメント

KIKU
2014年01月26日 01:27
コードを参考にさせていただいています。
このやり方だとMDBの文字コードがUNICODEだった場合に、文字化けしてしまいます。
どうしたら良いでしょうか?
ご教示いただけるとうれしいです。
2014年01月27日 22:47
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です。しかし、この方式では読み込みにエラーになるのではないかと思います。

この記事へのトラックバック