Power Automate DesktopからODBCでデータベースに接続する

Excel

Power Automate Desktopではデータベースを扱うことができます。通常はプログラミング言語→必要に迫られデータベースという順序で習得していくので、そもそもデータベースを使えるようなスキルを持っているのならば、自動化の手段にRPAを選択する必要はない気もしますが、せっかく使えるっていうのなら使ってみたいですよね。

ODBCでデータベース接続

Power Automate Desktopのデータベース接続にはいくつか方法がありますが、今回はODBCを使用します。ODBCはPower Automate DesktopではなくOSが提供する機能なので、あらかじめOS側にセットアップしておく必要があります。やり方はインターネッツにわかりやすい解説がたくさんあるのでここでは詳しくはやりません。

DBMSにはPostgreSQLを使用します。データベース名はsaitamaで、publicスキーマーにテーブルcustomer_padを作成しました。内容は架空の個人情報で構成は次のようになっています。

このデータベースにODBCで接続するためのドライバーをインストールして接続情報を入力します。Power Automate Desktopでは64bitのODBCドライバーしか対応しないと公式リファレンスに明言されているので、試していませんがそうなのでしょう。64bitを使うようにしてください。

テストボタンで接続できたら、保存ボタンでこれを保存します。データソース名はあとで使うのでわかりやすく命名しておくことをオススメします。

フローでデータベースを使用する

ODBCが準備できたら、フローのアクションから データベース → SQL接続を開く でデータベースへの接続ができます。

パラメータは1個しかないので設定アイコンをクリックすると詳細設定のダイアログが開きます。

データリンクプロパティでプロバイダータブから Microsoft OLE DB Provider for ODBC Drivers を選択して次へボタンを押します。

接続タブに移動するので 接続文字列を使用する を選択して、ビルドボタンを押します。

データソース名を使用する を選ぶとデータソースの候補が選択でき、先に設定したデータソース名を指定して接続テストをすると成功になるのですが、実際にフローで走らせると失敗します。意味がわかりません。バグってるんでしょうか。とにかくこれを書いている時点では私の環境ではデータソース名で指定はできませんでした。

ということで、接続文字列の方でやらざるを得ません。

データソースの選択画面になるので、コンピューターデータソースタブで先に設定したODBCのデータソース名を選択してOKボタンを押します。

ここでまた最初のODBC接続の設定画面がでますが、そのままOKします。

データリンクプロパティ画面に戻るのでOKボタンを押します。

SQL接続を開くのプロパティに超絶長い文字列が入ったら完了です。

フローでデータベースを読み込む(Excelと速度比較もする)

データベースに対してSQLを実行するにはアクションの データベース → SQLステートメントの実行 です。当然ですがSQL接続を開くアクションより後に入れてください。

パラメーターは4つですが、3つはPower Automate Desktopが良きに計らってくれるのでデフォルト値で問題ないはずです。

SQLステートメント:にクエリを記述します。

用が済んだらアクションSQL接続を閉じるで後片付けしておきましょう。


さて、データベースの利点と言えばまずはスピードですよね。そこでExcelとのデータ読み込み速度比較をしてみます。

Excelで上のデータベースと同じ構成の個人情報10,000件をシートから読み込むだけのフローを作成します。

Excelシートはこのようになっており

フローはこうなります。

フローの最初と最後に日時を変数に格納して、差し引きで処理時間を秒でメッセージボックスに表示させるようにしています。

実行すると

2.18秒かかりました。

同じ要領でデータベースから10,000件を読み込むフローを作成します。

実行すると

0.76秒でした。

RPAでこの程度の実行スピードの差が死活問題になることはないでしょうが。速くて困ることはありませんね。

フローからデータベースを動的に操作する

SQLがハードコーディングだと利用できる状況が限定的すぎるので、対話形式で動的にデータベースからデータを取得できるようにしたいです。

Power Automate Desktopではアクションのメッセージボックスでユーザーから入力を受け付けたり、表示をしたりできます。VBAのユーザーフォームのようなものです。

では、名前の一部を入力すると候補者一覧を表示し、候補者一覧から1名を確定すると、その人物の詳細情報を表示するというフローを作成します。データベースは前段で使用したものをそのまま使います。

しくみとしては、入力ダイアログで検索値を受け取り、SQLでnameにWHERE条件として設定して実行した結果をname列のみリストから選択ダイアログに表示します。リストに表示されたnameから対象者を1名選択すると、選択されたnameでSQLを実行し全列のデータを取得してメッセージを表示アクションで全データを表示します。

フローはこのようになりました。

簡単のため一切エラーハンドリングをしていないので、実用するにはもう少しステップが必要です。

実行すると入力ダイアログが出るので検索値を入力してOKボタンを押します。

候補者の人数と一覧がリストで表示されます。

リストを展開して1名選びます。

対象者が選択された状態でOKボタンを押します。

対象者の詳細情報が表示されます。

表示が小さくて見づらかったり、生年月日に時刻が入ってしまったりしてますが、気にしないでおきます。

RPAの性質上、不特定多数が利用するわけではないので問題にはならないですが、ユーザー入力値をSQLに直ぶち込みなので(いまどきのアプリなので自動エスケープされてるとは思いますが)SQLインジェクションができそうで気持ち悪いですね。プリペアドステートメント的な機能もなさげなので使い勝手はイマイチです。

今回のようにクエリの結果を単に表示するのではなくExcelファイルに書き出すようにすると、他のアプリで使っているデータベースから必要な情報をExcelとして切り出すことができて、RPAとしてのメリットを活かせる予感がします。

おわり。