COM を学ぶ(3) : Ruby の invoke メソッドだけでアクセスしてみる。

COMの仕組みを理解しようと Ruby の Win32OLE ドキュメント(win32ole: Ruby Standard Library Documentation)を追ってます。
前回の「COM を理解する(2):CでADODB.Connectionに接続する」にあるテーブルを表現した構造体に invoke がありますが、Rubyinvoke はそのへんを使っているっぽい。

$KCODE="s"
require 'win32ole'

sql     = "SELECT * FROM earthquake;"
connstr = "DRIVER={Microsoft Access Driver (*.mdb)};Dbq=D:\\lang\\Haskell\\sample1.mdb"

cn = WIN32OLE.new("ADODB.Connection")
cn.Open(connstr)
rs = cn.Execute(sql)
p rs.Fields.Count                   #=> 5
p rs.Fields(0).Name                 #=> "Name"
p rs.Fields(1).Name                 #=> "Day"
puts  rs.Fields.Item("Name").Value  #=> "関東大震災"
cn.Close

invoke メソッドを使って書く。

require 'win32ole'

sql     = "SELECT * FROM earthquake;"
connstr = "DRIVER={Microsoft Access Driver (*.mdb)};Dbq=D:\\lang\\Haskell\\sample1.mdb"

cn = WIN32OLE.new("ADODB.Connection")
  # これも OK
  # cn = WIN32OLE.new("{00000514-0000-0010-8000-00AA006D2EA4}")

# version
p cn._getproperty(4, [], [])           #=> "2.8"
cn.invoke("Open", connstr)

# ConnectionString
p cn._getproperty(0, [], []) 
#=> "Provider=MSDASQL.1;Extended Properties=\"DBQ=D:\\lang\\Haskell\\sample1.mdb;
Driver={Microsoft Access Driver (*.mdb)};
DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;\""

rs = cn.invoke("Execute", sql)
p rs.invoke("Fields").invoke("Count")  #=> 5
p rs.invoke("Fields",0).invoke("Name") #=> "Name"
p rs.invoke("Fields",1).invoke("Name") #=> "Day"
puts rs.invoke("Fields").invoke("Item","Name").invoke("Value")  #=> "関東大震災"
cn.invoke("Close")

WIN32OLE#_invoke(dispid, args, types) という dispid による更に C に近いプリミティブなメソッドもある。