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
項目の型は、数字で表示されます。
項目の型
|
|
|
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の例を以下に示します。
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