 
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"
 |