since 2002/01/01
lastupdate 2003/02/28
   

リンクテーブルとパススルークエリ

ACCESS で PostgreSQL を使う上でもっともお手軽なのがリンクテーブルです。
一旦リンクテーブルとして PostgreSQL のテーブルにリンクしてしまえば、 あとは普通の ACCESS のテーブルと同じように操作できます。
(ただし、完全に同じではないし、よくわからないエラーになることもありますが...)
まぁ、手っ取り早い、ということではこれが一番簡単でしょう。
とりあえずファイルDSNは作ってありますか?作ってない場合は こちら を参照してください。


リンクテーブルを作る

それではODBCリンクテーブルを作って見ましょう。

  1. では、まず空のACCESSデータベースを作成します。名前は何でもいいです。
  2. 作ったら、ファイル - 外部データの取り込み - テーブルのリンク の順でメニューを選択します。
  3. そうすると リンク ダイアログが開くので、ファイルの種類に ODBC Database(一番下)を選択します。
  4. 次にデータソースの選択ダイアログが開くので、そこから使用するデータソース(TEST)を選択します。
  5. データソースの設定に問題がなければ テーブルのリンク ダイアログに変わり、 PostgreSQL 側のテーブルが一覧表示されるので、必要なテーブル(zaiko)を選択して OK をします。
  6. これでテーブルがリンクされ、アクセス可能となります。

設定によってはユニークなキーを決めてくれ、と聞いてくるかもしれません。 この場合で設定しないと読み取り専用となります。(Recognise Unique Indexes がOFFの場合)

テーブルがリンクされれば準備は完了です。あとは ACCESS のテーブルと同じように扱えます。
どうですか、zaiko テーブルが地球アイコン!?になってリンクされているはずです。 開いて中を見てみましょう。データが見えますか?
エラーが出る場合はなんか原因があるはずですので、いろいろ調べてみてください(^^;;;

さて、これで PostgreSQL のテーブルを ACCESS から自由に扱うことができるようになりました。
ただし、一度にたくさんのレコードをデータシートビューで操作したりするとエラーになったり、 最悪落ちたりすることもあるようなので、注意した方が良いかも知れません(^^^;;;

パススルークエリを作る

パススルークエリは、ODBC ドライバ経由で直接 PostgreSQL データベースへクエリを発行します。 また、パススルークエリでは、通常のクエリと違って全て SQL文 でクエリを書く必要があり、 この際に書く SQL は ACCESS の SQL ではなく、PostgreSQL の SQL を書かなければなりません。 基本的な構文は同じですが、ワイルドカードなどに違いがあるので注意が必要です。
ですので、SQL が苦手な方はリンクテーブルをレコードソースにした普通のクエリの方が扱いやすいと思います。

では、次にパススルークエリを作ってみます。

  1. ACCESS データベースを開き、メニューから 挿入 - クエリ を選択します。
  2. そうすると クエリの新規作成 ダイアログが開くので、とりあえず デザインビュー を選びます。
  3. 次に テーブルの表示 ダイアログが出るので、ここでは一旦 閉じる を選択しダイアログを閉じます。
  4. そしたらメニューから クエリ - SQL - パススルー を選ぶとデザインビューが真っ白になります。
  5. さらにメニューから 表示 - プロパティ を選びプロパティ画面を表示させます。 すでに表示されていた場合はそのまま表示させておいてください。
  6. プロパティの中に ODBC接続文字列 というのがあるのでその欄をクリックし、 右側に出てくる「...」ボタンをクリックすると、ファイルDSN の選択ダイアログが開きます。
  7. そしたら必要な ファイルDSN を選択してやると ODBC文字列 が勝手に設定されます。 尚、このとき 接続文字列にパスワードを含めますか? と聞かれるかもしれないので、必要に応じて答えます。
  8. 後は、真っ白な部分に、有効なSQL文字列を記入します。例えば、
    SELECT * FROM zaiko ;
    などと入力してみてください。
  9. 最後にクエリを実行すれば ODBC経由 で PostgreSQL データベースから返されたデータが表示されます。

パススルークエリは ODBCワークスペース を使うより扱いが楽なので、VBA でもいい感じかも知れません。 ただし、パススルークエリを QueryDef から実行しても RecordsAffected プロパティを参照できないので、 結果を確認したい場合などは ODBCワークスペース の方が良いでしょう。