テクセル
Rubyでmdb、accdbファイル操作(ODBC)

RubyからODBC経由でMicrosoft Accessのデータベース(mdb、accdbファイル)を操作します。 accdbのコンポーネントがインストールされてない場合は、Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントより 「AccessDatabaseEngine.exe」をダウンロードしインストールします。 ODBCの設定及び実行環境は、以下となります。

  1. コントロールパネルの「管理ツール」を開き「データソースODBC」を選択します。
    Windows7 64ビットの場合は、コントロールパネルの「データソース(ODBC)(32ビット)」を選択します。アイコンがない場合は、 「C:\Windows\SysWOW64\odbcad32.exe」を起動します。
  2. ユーザDSNタブの「追加」ボタンを押します。ドライバー一覧が表示されます。
  3. 「Microsoft Access Driver (*.mdb,*accdb)」を選択し、「完了」ボタンを押します。 「ODBC Microsoft Access セットアップ」ダイアログが表示されます。
  4. データソース名を入力します。mdbの場合は「mdb0」と入力します。accdbの場合は、「accdb0」と入力します。
  5. 「作成」ボタンを押します。データベース新規作成ダイアログが表示されます。 データベース名の入力及び形式の選択を行います。mdbの場合は、「Mdbtst0.mdb」と入力し、形式「Version 4x」を選択します。 accdbの場合は、「Accdbtst0.accdb」と入力し、形式「Version 12x」を選択します。 作成するフォルダを選択し「OK」ボタンを押しファイルを作成します。
データソース(DSN)名 mdb0(mdb),accdb0(accdb)
使用したRubyのバージョン  ruby 2.0.0p195(ActiveScriptRuby)

ODBCによるmdb(accdb)への接続

  1. メソッドconnectを使用
  2. driverConnectの接続文字列でデータソースを指定
  3. driverConnectでウインドウハンドル、SQL_DRIVER_PROMPTを指定し、データソース選択ダイアログから選択
  4. driverConnectでデータソースを指定せず、接続文字列にODBCドライバを指定し接続

「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"
Rubyユーティリティ
©2011-2013 TEXCELL CORPORATION