2020年8月14日金曜日

Excelでデータベース ~ 或いは今更のADO ~

 最近Excelを扱うプログラムをいくつか書いた

で、Excelでデータベースが扱えたら便利な気がした。

思い出したのがadodbを使えば楽にSQL構文でいろいろなデータソースを扱えるということ。

※そもそもaccessのVBAで書いていたころはあまりスピードも変わらなかったし別のリソースを読みこむということもなかったのでadoを使わず専らdaoを使っていた。フィールド名などのデータ構造もdaoであれば一元で扱えた。adoだとadoxが必要になる

で、recordsetの扱いとしては比較的似たコードになるとはいえ今更ながらのado入門(正確には最初にどちらかにするために弄ったときに一通りは書いたので再入門)を果たすこととなった。

こちらのサイトなどを参考にさせていただきつつExcelでいくつかの条件を付けてSQLを流してシートに抽出するマクロを用意した。

元データとしては「なんちゃって個人情報」さんで5000行のcsvを利用

いろいろと条件を変えつつベンチをとってみたがどうしても単一のテーブルからwhereで条件をつけてデータを抜くような単純なものになるので結構実行速度は速かった。またそのような使い方ではデータベースソースを置く媒体(SSD,HDD,NAS,USB,MO)でさほど速度も変わらなかった。
(例外的にMOでだけaccdbが遅くなったがもっとも複雑な構造なので遅い媒体上では不利なのかもしれない。)

皮肉なものでaccessでCOMを使って裏でexcelを起動してxlsxのファイルなどを作成・更新する時間が惜しいので速くなる方法を調べていてtransferspreadsheetに行き着いたんだけどc#ならclosedXMLでexcel無しに直接ファイルを操作できるので速いのにって調べているうちに小さなシステムで顧客の各PCにはaccessはないのだしexcelのファイルをexcelのマクロで扱う方が起動時間の分速くなるかなって思って考えているうちに今回の仕儀とあいなりました。こういう情報もあることだしexcelである程度まとまったデータはadoで扱おうと思う。

0 件のコメント:

dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...