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

Visual Basic (ACCESS VBA) によるアクセス

さて、ACCESS を使うなら、やはり VBA (Visual Basic for Application) を使いますよね?
やはりイベントプロシージャは便利ですし、マクロよりも当然強力なので使いでがあります。 まぁその分とっつきは悪いわけですが、一般的なデータの更新や追加などを行うのなら、そんなに難しいことを知らなくても結構できてしまいます。
VBA については、そのうち入門ページなども、と考えていますが、ここは PostgreSQL との連携を考える場所なので、また今度(^^;;;
尚、ここでも例のサンプルデータベースを使っていますので、 サンプルが必要な方は、こちら をお使いください。

また、ここでは全て DAO によるプログラミングとなっています。私はそれしか知らないので(^^;;;
通常 ACCESS2000 では ADO が標準となっていますので、VisualBasicEditor の参照設定で ADO をはずし、DAO3.6 を設定しておいてください。

さて、VBAでPostgreSQLテーブルへアクセスするにはいくつか方法がありますので、とりあえず並べてみます。

  1. リンクテーブルからレコードセットオブジェクトとして開く
  2. パススルークエリからレコードセットとして開く
  3. パススルークエリをQueryDefとして開きSQLを発行する
  4. ODBCワークスペースからレコードセットオブジェクトとして開く
  5. ODBCワークスペース内でクエリを発行する

などがあります。それぞれ一長一短があるようですが、私が良く使うのはリンクテーブルからレコードセットとして開く場合と、ODBC ワークスペースからクエリを発行する方法です。 ただし、ODBC ワークスペースは手続きが面倒で、その都度コネクションも完結するので速度は遅いかもしれませんが、リンクテーブルなどが必要ないため、たとえばパスワードを照会するテーブルなど、簡単にアクセスされては困る場合には逆に便利です。

まぁ、実際にはリンクテーブルを作った時点で ODBC ワークスペース以外の方法は、ほぼ Jet を使うのと同じですので、 特別なこともないので特別難しいこともないですね。


レコードセットでアクセスする

これは、特別説明も要らないでしょう。
例えば、次のようにしてアクセスできます。SELECT 文のパススルークエリーも同じようにレコードセットとして開けますが、 パススルークエリーをレコードセットとして開いても、そのレコードセットは読み取り専用です。
もちろんテーブルの場合は addnew や edit で update が行えます。
(サンプルのソースを使用するには ODBC リンクテーブル zaiko が必要です。)

Function useLinkTableAsRecordset()
'レコードを全てデバッグ出力する
Dim Rs As Recordset
Set Rs = CurrentDb.OpenRecordset("zaiko")

Do Until Rs.EOF
Debug.Print Rs!hinmei & " => " & Rs!zaiko
Rs.MoveNext
Loop

Rs.Close
End Function

パススルークエリでアクションクエリを実行

パススルークエリを VBA から実行するのも特別な手順は必要ないでしょう。 これも説明不要かな?とりあえずサンプル。
尚、このコードを実行するには、アクションパススルークエリとして クエリ1 があらかじめ定義されている必要があります。 SELECT 文のパススルークエリではエラーになります。

Function usePassThroughQuery()
'QueryDefオブジェクトでデータを更新します
Dim qdf As QueryDef

Set qdf = CurrentDb.QueryDefs("クエリ1")
qdf.sql = "UPDATE zaiko SET zaiko = 75 WHERE hinmei = 'red' ;"

qdf.Execute
qdf.Close

'今使ったクエリを普通に実行してみます
DoCmd.SetWarnings False 'アクションクエリ実行の確認メッセージを表示しない
DoCmd.OpenQuery "クエリ1"
DoCmd.SetWarnings True 'メッセージの表示を元に戻す

End Function

ODBCワークスペース

さて、ODBC ワークスペースとは何でしょう?
かくいう私も PostgreSQL を使うまで良くわかりませんでしたし、だいたい今でも良くわかりません(^^;;;
わかる範囲でごく大雑把に言えば、Jet エンジンを介さずに、 直接 ODBC ドライバを通して PostgreSQL にアクセスする作業域、といったところですかね。 ま、いずれにしても ODBC ワークスペースを用意しない限りは、直にはアクセスできません。
所で、PostgreSQL にアクセスする方法はいろいろあるけど、実際どうなんでしょう? 実行速度やコードの書きやすさ、など評価する点はいくつかあると思いますけど、どれが一番良いのでしょうかね。
まぁ、最終的には好みの問題にもなるでしょうけど。

話がそれましたが、ODBC ワークスペースを作ったデモサンプルを用意しました。 ちょっと長くなったので別紙としました。
興味のある方は こちら からどうぞ。 デモといってもレコードセットでデータを表示してクエリを実行するだけです。
また、データの更新はレコードセットでもできるのですが、せっかくですので SQL を発行しました。 ただし、ODBC ワークスペースでは、PostgreSQL へ直接SQLを発行しますので、PostgreSQL の文法で SQL を書いてください。
主な違いとしては、ワイルドカード * 及び ? はそれぞれ % 及び _(アンダースコア) になります。 また、文字列の結合演算子も & ではなく || になります。

サンプル useODBCWorkspace の説明

サンプルプロシージャ

ではサンプルを簡単に説明します。ただし、モジュールをそのままエクスポートしたものなので、行番号も付いていないので、 少し説明がわかりづらい部分はご容赦ください。では簡単に説明します。

まず 5 行目以降で、各オブジェクト変数などを定義しており、次の 11 行目からが PostgreSQL データベースへ接続する部分です。
CreateWorkspace の第 1 引数は、ワークスペースの名前を指定しますが、通常は空文字でもかまいません。 第 2 引数にはそのワークスペースの所有者となるユーザの名前を書きますが、通常は "admin" としておきましょう。
さらに第 3 引数はパスワードですが、これも空文字とし、最後に ODBC ワークスペースを指定する定数、 dbUseODBC を指定します。 ここは一覧から選べないので、自分で書いてください。

また、13 行目が実際にデータベースへの接続をするところです。 OpenConnection の第 1 引数は、接続の名前を指定するようですが、空文字としておきます。 第 2 引数は接続時のオプションですが、DSN ファイルがあるならば、dbDriverNoPrompt を設定しておきましょう。
次の引数は、読み取り専用にするかどうかを Boolean で指定します。 最後の引数が、ODBC 接続文字列です。 ファイルDSNを使用できるし、した方が良いですが、その場合で最低限の文字列は必要なようです。
今回接続文字列は、11 行目の変数 conStr に格納しています。 conStr の最後の方で FILEDSN=TEST とありますが、これはファイル DSN を使う場合の書き方です。

ここまでちゃんとできれば後は簡単です。こちらも Jet とほぼ同じ手順で操作できるからです。
サンプルでも、16 行目から普通に QueryDef を定義しそこからレコードセットを開いています。
尚、CreateQueryDef の第1引数に本来は名前を指定するようですが、ここでは空白にしておきます。
で、21 行目から 24 行目でレコードセットの全てのデータをイミディエイトウィンドウに出力します。

今度は SQL を発行してデータを更新します。
31 行目で QueryDef の SQL プロパティを変更し、実行 ( Execute ) します。
33 行目では SQL の発行で影響のあったレコード数を調べて表示させています。

そして、繰り返しになりますが、SQL の発行でデータが更新されていることを確認するため、 再度レコードセットを開きイミディエイトへ出力し、最後にオブジェクト変数を開放し終了です

test counter: - - -