役に立ちそうもないTips移転版

俺得なTipsを書き連ねるだけのブログ。

Access2013: DBファイルをADOで開きたいときの対処

とりあえず2007ではADODB.Connectionで"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=hogehoge"とやっとけば、普通に.accdb(と多分.mdb)を読み書きできた。
DMLどころかDDLも平気で突っ込める。しかもインプロセス(試せば分かるが、MSAccess.exeは起動していないはず)。


……が、2013ではAccessの外からMicrosoft.ACE.OLEDBプロバイダは使えなくなったっぽい(この書き方は不正確な可能性が高いがどう書けば正確なのかよくわからんorz)
要するにWSHとかでADODB.Connection使ってaccdbを操作するスクリプトの類は全滅。
回避策としては、Access2007/2010のランタイムだけ別途突っ込めば外から使えるMicrosoft.ACE.OLEDBプロバイダも入るが、このランタイムがいつまで使えるかという問題も。*1


じゃあどうすんだというと、とりあえずアウトプロセスでやっちゃえば問題はない。
つまりADODB.Connectionのインスタンスを生成するんでなく、Access.Applicationをどーんと生成してApplication#OpenCurrentDatabase()でDBをロードし、そこからApplication.CurrentProject.ConnectionとやってConnectionを取れば、ほら懐かしのADODB.Connectionが。*2


でも重いよね (´・ω・`)
ちなみに.mdbを開きたい場合は2013ではアウトプロセスにしたって無理らしいので2007/2010でなんとかしましょう。


追記: 64ビットWindowsWSH動かしたら「プロバイダがインストールされてない」とか怒られる話はおそらく別。
それは多分、その環境に入ってるAccessが32ビットで、wscript.exe/cscript.exeは黙って動かせば64ビットだから、という話。
COMであっても64ビットプロセスと32ビットモジュールとは同じ世界(プロセス空間)では生きられないのです……

*1:2007のランタイムが未だに配布されてて使えるんだから、あんまし先走って悲観しなくてもいいかもしれんけど。

*2:実際のところMSとしてはOLE DB全廃の方向なので、レガシADOを使うこと自体避けた方がいいのかもしれないが……ODBCマンドクセ