RubyからODBC経由でMicrosoft Accessのデータベース(mdb、accdbファイル)を操作します。 accdbのコンポーネントがインストールされてない場合は、Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントより 「AccessDatabaseEngine.exe」をダウンロードしインストールします。 ODBCの設定及び実行環境は、以下となります。
データソース(DSN)名 | mdb0(mdb),accdb0(accdb) |
使用したRubyのバージョン | ruby 2.0.0p195(ActiveScriptRuby) |
ODBCによるmdb(accdb)への接続
「odbc.rb」の説明及びダウンロード
「wincons.rb」の説明及びダウンロード
# -*- coding: utf-8 -*- # ODBC->mdb,accdb require "./odbc" class MdbOdbc < Odbc def initialize super(__ENCODING__) end def execQuery(sSQL) ir = execdirect(sSQL) if ir != 0 sa = "ODBC mdb SQL error¥r¥n" + getErr + "¥r¥n[" + sSQL + "]¥r¥n" print sa disconnect exit end return ir end end imdb_accdb = 0 # 0:mdb 1:accdb sdsn = (imdb_accdb == 0) ? "mdb0": "accdb0" mdbodbc = MdbOdbc.new # ir = mdbodbc.connect(sdsn,"","") ir = mdbodbc.driverConnect("DSN=" + sdsn + ";UID='';PWD=''") # wcons = Console.new(__ENCODING__) # ir = mdbodbc.driverConnect("DSN=mdb0;UID='';PWD=''",wcons.hConWndHndl,SQL_DRIVER_PROMPT) # scstr = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};" + # "DBQ=" + __dir__ + "¥¥mdbtst0.mdb;" + # "Uid='';Pwd=''" # ir = mdbodbc.driverConnect(scstr) if ir != 0 print "接続エラー " + ir.to_s + "¥r¥n" print mdbodbc.getErr exit end print mdbodbc.sconstr + "¥r¥n" itblindx = -1 print "テーブル一覧¥r¥n" ir,ardt = mdbodbc.tableList ic = 0 ardt.each{|cat, schem, name, type, rem| cat = "" if cat == nil schem = "" if schem == nil name = "" if name == nil type = "" if type == nil rem = "" if rem == nil print cat + "," + schem + "," + name + "," + type + "," + rem + "¥r¥n" if name == "tbl4" && type == "TABLE" itblindx = ic end ic += 1 } print "¥r¥n" if itblindx == -1 sSQL = "CREATE TABLE tbl4 (" + "id int PRIMARY KEY," + "tda datetime," + "cnote char(20))" mdbodbc.execQuery(sSQL) else print ardt[itblindx][2] + "テーブルのカラム¥r¥n" ir,ardt = mdbodbc.tableColumns(ardt[itblindx][0],ardt[itblindx][1],ardt[itblindx][2]) ardt.each{|arz| sa = "" arz.each{|sb| sb = "" if sb == nil sa += sb + "," } print sa + "¥r¥n" } end sSQL = "SELECT max(id) FROM tbl4" mdbodbc.execQuery(sSQL) ir,ardt = mdbodbc.getData id = 0 if ardt.length != 0 id = ardt[0].to_i id += 1 end sSQL = "INSERT INTO tbl4 VALUES (" + id.to_s + ",'" + Time.now.strftime("%Y-%m-%d %H:%M:%S") + "'," + "'日本ニホン123abc①Ⅱ☀')" mdbodbc.execQuery(sSQL) #データ書き込み print "データ表示¥r¥n" sSQL = "SELECT TOP 5 * FROM tbl4 ORDER BY id DESC" mdbodbc.execQuery(sSQL) ir,ardt = mdbodbc.describeCol print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n" while true do ir,ardt = mdbodbc.getData if ir == -1 break end print ardt[0] + "," + ardt[1] + "," + ardt[2] + "¥r¥n" end mdbodbc.disconnect print "終了¥r¥n" |