コマンドラインからMDB/ACCDBファイルのデータをSQLで抽出する
AccessとかインストールされていないPCでMDBファイルを読んだり操作したりすることが多いので、こんなスクリプト(jetsql.vbs)を書いてみた。
使い方はこんな感じ:
Access 2007 の accdbファイルにも対応してみた。
ただし、エンジンのインストールは必要。
参考: MSDN のADOのページ - http://msdn.microsoft.com/ja-jp/library/cc411360.aspx
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
この記事へのコメント
このやり方だとMDBの文字コードがUNICODEだった場合に、文字化けしてしまいます。
どうしたら良いでしょうか?
ご教示いただけるとうれしいです。
残念ながら文字化けの理由は私にもよくわかりません。
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です。しかし、この方式では読み込みにエラーになるのではないかと思います。