PostgreSQL 外部データベース(MS-Access, Excel, CSV) 接続用関数 - ExtLink

[ ホーム ] [ 上へ ]

ダウンロードは こちらから

文章だけでは分かりづらいのでjetlink関数を使ったExcelデータ取得時の スナップショットを掲載します。左側ウィンドウのpgAdmin(PostgreSQL)から 右側のExcelのWorkbook.xlsのシートのデータを取得するデモンストレーションです。


[2013-6-20] バージョンアップ Ver.0.9.8

バージョン番号が変化していませんが、変更したのはインストーラのほうでコンソールで処理して いたものをGUIに変更しました。


[2013-4-1] バージョンアップ Ver.0.9.8

PostgreSQL 9.1.x , 9.2.xに対応した上で、Extlinkのデフォルトインストール先を C:\ExtLink\フォルダからC:\Program Files\ExtLinkに変更しました。


[2011-5-28] バージョンアップ Ver.0.9.7

内容的にはPostgreSQL 9.0.xに対応しただけで何の機能も加えていません。 今回ちょっと変更した点はインストーラです。このエクステンション、 インストーラでjetlinkを含むすべての関数をPostgreSQLに組み込んでいて、 その際にlibpqライブラリを使っています。つまり、インストーラがlibpq(Cライブラリ)に 依存している形になっています。私も迂闊だったのですが、これを静的にリンクしていたので、 もし、環境変数でlibpq.dllがあるパスが通っていなかったら、インストール自体ロールバックして しまい、インストールさえできない状況になることを気づきました。libpq.dllがある フォルダはpg_dumpやpsqlなど普段よく使うユーティリティがあるのでパスを通している方が 多いと思いますが、ReadMeにも注釈をいれなかったのでまったく使えなかった方もいるかもしれません。 連絡・クレーム等をいただかなかったので気づくのが遅れました。今回はlibpqを動的に リンクするように変更したので多分うまくいくかと思います。


[2010 - 7 - 23] バージョンアップ Ver.0.9.6

これまでは PostgreSQLにMS-AccessやExcelからデータ取得しかできませんでしたが、ようやく Jetデータソースに対して挿入・更新・削除もできる関数(jetinsert、jetupdate、jetdelete)を加えた ExtLinkができました。(JetデータベースエンジンのISAMドライバの制限はあります)

jetlink関数とあわせると、これで一応PostgreSQLから相互のデータ操作ができるようになりました。


[2010 - 4 - 23] バージョンアップ Ver.0.9.5

SQL Serverへの接続に対応しました。(mssqllink関数)


[2010 - 4 - 2] バージョンアップ Ver.0.9.4

PostgreSQLからMS-Access、Excel、テキスト(CSV)のデータソースへの接続を可能にするExtLinkを バージョンアップしました。バージョンアップというほど大したことはしてないです。念のため。 0.0.1しかあがってなく機能もほとんど追加してません。 ただ、内部の動作を大幅に変更したので相当書き換えました。

これまでのバージョンでは外部データベースのデータすべてのメモリを一気に確保していたので、 レコード数が多い外部データを取得する時は膨大なリソースを必要としていました。 今回から取得レコード単位でメモリを確保するようにしたのでメモリ効率がアップしたと思います。 これに伴い、各フィールドサイズも最大100バイトだったものが、外部データソースの 各フィールドサイズまで取得可能になり、ExtLink側の制限はなくなりました。

あと、結果セットの各フィールドでサポートするデータ型の種類を拡大しました。

今回のバージョンからPostgreSQL 8.4.x系に対応しました。

次のバージョンではSQL Serverからのデータ取得を可能にするつもりです。


[2008 - 10 - 25] 初版公開

データベースはMS-AccessとPostgreSQLを好んで使っているのですが、Accessはお金を払って 購入しただけあって至れり尽せりです。普通にデータベースソフトとして使うには最も効率よく 開発できます。ただ、踏み込んでややこしいことをしようとするとブラックボックスがあり 一筋縄ではうまくいかないことがあります。

一方、PostgreSQLはソースが公開されているので、いざとなればそれを追いかければ 何とかなることも多いのですが、基本的には 「ないものは自分でつくれ!」 でなかなかたいへんです。

ないものの一つでいつも不便に思っていたのがPostgreSQLからMS-Accessなどに 接続することができないことです。

AccessからExcelに接続する時は

SELECT * FROM [Sheet1$] IN "" [Excel 8.0;HDR=Yes;DATABASE=D:\AAA.xls;];

SQL ServerからExcelに接続する時は

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',

'Excel 8.0;HDR=Yes;DATABASE=D:\AAA.xls',

'SELECT * FROM [Sheet1$]')

こんな感じでできるのですがPostgreSQLではできないのです。

で、どうするかというと、クライアント側でNpgsql、PgOleDb、ODBCで処理するか、サーバ側でやるとすると、 前準備でExcelデータをCSVに落としておいてCOPY FROMで一時テーブルに取り込んで実現するくらいしか 思いつかないです。

そこで今回作ったServer Extensionsのjetlink関数を使うとAccessやSQL Serverと同じような感じで Excelデータをサーバ側の処理で取得できるようになります。

SELECT * FROM jetlink('D:/AAA.xls'

, 'Excel 8.0;HDR=Yes;'

, 'SELECT * FROM [Sheet1$];') AS T1(f1 int, f2 text, f3 text);

インストール方法や詳しい使い方はダウンロードしたファイル内にあります。

※現在のバージョンではAccess, Excel, CSVからデータの取得は可能ですが、 PostgreSQLからAccess、Excelなどに対して更新はできません。

※余裕があればSQL Serverへの接続にも対応するつもりです。

※PostgreSQLの対応バージョンは8.2系、8.3系で、8.1系にも対応しようと思ったのですが、 このバージョンだけは Visual C++ 2005のCRTのヘッダファイルcrtdefs.h内で定義されている errcodeに対して、PostgreSQLのelog.hヘッダファイルで定義されている errcode(int sqlerrcode)関数が再定義されてしまってコンパイルが通らないのです。

ということで、今のところ8.1系は非対応です。回避策がわかれば こちら にご連絡いただけると対応するつもりです。

ダウンロードは こちらから