テクセル
Rubyでmdb,accdbファイル操作(ADO)

RubyからADO経由でMicrosoft Accessのデータベース(mdb,accdbファイル)を操作します。実行環境は、以下です。

Rubyのバージョン  ruby 2.4.0p0 (ActiveScriptRuby) 32ビット

accdbのコンポーネントがインストールされてない場合は、Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントより 「AccessDatabaseEngine.exe」をダウンロードしインストールします。
下記例は、変数imdb_accdbが0の場合はmdbとして、1の場合はaccdbとして動作します。プログラムと同じフォルダ内にデータベース ファイルが存在しない場合は作成されます。

Rubyによるmdb,accdbファイル使用例(ADO Windows用)


# -*- coding: Windows-31j -*-
# mdb,accdb 例
require 'win32ole'

imdb_accdb = 0               # 0:mdb 1:accdb
stblName = "tbl6"            # テーブル名
sdbfile = (imdb_accdb == 0) ? "mdbtst1.mdb": "accdbtst1.accdb"  #dbファイル名
sconnStr = (imdb_accdb == 0) ? "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=":
                               "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="

sdb = __dir__ + "/" + sdbfile
connStr = sconnStr + sdb

cat = WIN32OLE.new("ADOX.Catalog")
br = File.exist?(sdb)                  # dbファイルの存在?
if br == false
   cat.Create connStr                  # 新規作成
end

conn = WIN32OLE.new("ADODB.Connection")
recs = WIN32OLE.new("ADODB.Recordset")
conn.Open connStr

itblf = -1
cat.ActiveConnection = conn
tbls = cat.Tables                      # テーブル一覧
sa = ""
tbls.each{|tbobj|                      # テーブル存在確認
   if tbobj.Type == "TABLE"
      if tbobj.name == stblName
         itblf = 1
      end
      sa += tbobj.name + ","
   end
}
print "テーブル一覧:" + sa + "¥r¥n"

if itblf == -1                         # テーブル作成
   sSQL = "CREATE TABLE " + stblName + " (" +
          "id int PRIMARY KEY," +
          "tda datetime," +
          "cnote char(20))"
   conn.Execute sSQL
end

sSQL = "SELECT count(*) FROM " + stblName
recs.Open sSQL, conn                   # レコード数
ik = recs.Fields[0].value
recs.Close()

id = 0
if ik > 0
   sSQL = "SELECT max(id) FROM " + stblName
   recs.Open sSQL, conn
   id = recs.Fields[0].value
   recs.Close
end
id += 1

sSQL = "INSERT INTO " + stblName + " (id, tda, cnote) VALUES (" +
       id.to_s + ",'" +
       Time.now.strftime("%Y-%m-%d %H:%M:%S") + "'," +
       "'日本ニホン123abc①Ⅱ')"
conn.Execute sSQL

sSQL = "SELECT TOP 5 * FROM " + stblName + " ORDER BY id DESC"
recs.Open sSQL, conn
print "項目名、型¥r¥n"
ifk = recs.Fields.Count                # 項目数
sa = ""
for ia in 0..(ifk - 1)
   sa += recs.Fields[ia].Name + ":" + recs.Fields[ia].Type.to_s + ","
end
print sa + "¥r¥n"
print "レコード内容¥r¥n"
while recs.EOF == false do
   sa = recs.Fields[0].value.to_s + "," +
        recs.Fields[1].value.to_s + "," +
        recs.Fields[2].value
   print sa + "¥r¥n"
   recs.Movenext
end

# UPDATE例
=begin
recs.Close
AdOpenStatic = 3        # カーソルタイプ
AdLockOptimistic = 3    # ロックタイプ
sSQL = "SELECT * FROM " + stblName + " WHERE id = " + id.to_s
recs.Open sSQL, conn, AdOpenStatic, AdLockOptimistic
recs.Fields["cnote"] = "千葉県xyz789"  # or recs.Fields[2] = "千葉県789xyz"
recs.Update
=end

# DELETE例
=begin
recs.Close
AdOpenStatic = 3        # カーソルタイプ
AdLockOptimistic = 3    # ロックタイプ
sSQL = "SELECT * FROM " + stblName + " WHERE id = " + (id - 2).to_s
recs.Open sSQL, conn, AdOpenStatic, AdLockOptimistic
recs.Delete
=end

recs.Close
conn.Close
   

項目の型は、数字で表示されます。

項目の型
データ型 型値
ADEMPTY 0
ADTINYINT 16
ADSMALLINT 2
ADINTEGER 3
ADBIGINT 20
ADUNSIGNEDTINYINT 17
ADUNSIGNEDSMALLINT 18
ADUNSIGNEDINT 19
ADUNSIGNEDBIGINT 21
ADSINGLE 4
ADDOUBLE 5
ADCURRENCY 6
データ型 型値
ADDECIMAL 14
ADNUMERIC 131
ADBOOLEAN 11
ADERROR 10
ADUSERDEFINED 132
ADVARIANT 12
ADIDISPATCH 9
ADIUNKNOWN 13
ADGUID 72
ADDATE 7
ADDBDATE 133
ADDBTIME 134
データ型 型値
ADDBTIMESTAMP 135
ADBSTR 8
ADCHAR 129
ADVARCHAR 200
ADLONGVARCHAR 201
ADWCHAR 130
ADVARWCHAR 202
ADLONGVARWCHAR 203
ADBINARY 128
ADVARBINARY 204
ADLONGVARBINARY 205
ADCHAPTER 136

□ UPDATE

UPDATEの例を以下に示します。項目名「cnote」の内容を変更します。「recs.Open sSQL, conn, AdOpenStatic, AdLockOptimistic」の第3引数には、 レコードセットのカーソルタイプを指定します。 第4引数には、レコードセットのロックタイプを指定します。


AdOpenStatic = 3        # カーソルタイプ
AdLockOptimistic = 3    # ロックタイプ
sSQL = "SELECT * FROM " + stblName + " WHERE id = " + id.to_s
recs.Open sSQL, conn, AdOpenStatic, AdLockOptimistic
recs.Fields["cnote"] = "千葉県xyz789"  # or recs.Fields[2] = "千葉県789xyz"
recs.Update
   

□ DELETE

DELETEの例を以下に示します。


AdOpenStatic = 3        # カーソルタイプ
AdLockOptimistic = 3    # ロックタイプ
sSQL = "SELECT * FROM " + stblName + " WHERE id = " + (id - 2).to_s
recs.Open sSQL, conn, AdOpenStatic, AdLockOptimistic
recs.Delete
   

□ テーブルの削除

テーブル削除の例を以下に示します。テーブル名「tbl5」を削除します。


sSQL = "DROP TABLE tbl5"
conn.Execute sSQL
   

参考にしたページ:Rubyist Magazine - Win32OLE 活用法 【第 3 回】 ADODB

Rubyユーティリティ
©2012-2018 TEXCELL CORPORATION
テクセル株式会社