VC++ による PostgreSQLデータベース操作について(2002-01-18)

・ Windows上で クライアントインターフェース libpq.dll を使うには

Windowsマシンから、PostgreSQLクライアントプログラムを作成するためには、 PostgreSQL用 ODBC ドライバを使用して、VisualBasic や MS-Access、あるいは OLE DB等を使用してプログラムを作成するか、libpq.dll を使用して C言語などで直接プログラムを作成する必要があります。

PostgreSQL用ODBC ドライバも、Windows用 libpq.dll も、インターウィズの 片岡氏が作成しておられます。URLは以下のとおりです。

インターウィズPostgreSQL関連情報
    http://www.interwiz.koganei.tokyo.jp/software/PostgreSQL/index.html
PostgreSQL ODBC Driver 日本語版
    http://www.interwiz.koganei.tokyo.jp/software/PsqlODBC/

ODBCを使用したアクセスは通常のデータベースと同じですので、ここでは libpq インターフェースを使用したプログラミングについて解説します。 ダウンロードした libpq-6.5jp.zip を適当なフォルダに解凍します。 以下にファイルを示します。

 1. ヘッダファイル - postgres_ext.h, libpq-fe.h
 2. インポートライブラリ - libpqdll.lib
 3. ダイナミックリンクライブラリ - libpq.dll

上記 1.ヘッダファイルと、2. インポートライブラリファイルを自分の作成する プロジェクトフォルダか、インクルードパスの通ったフォルダに保存します。 3. の DLL 本体は、Windows のシステムディレクトリなど、実行パスの通った フォルダに保存しておきます。


VCでプログラムを作成するためには、データベースにアクセスするクラスか 全体のヘッダファイルである StdAfx.h にヘッダファイルをインクルードする必要が あります。また、インポートライブラリの指定もしなければなりません。 ここでは、同じく StdAfx.cpp にライブラリの指定をすることにします。


[StdAfx.h]
//--- libpq header file for PostgreSQL ---
#include "postgres_ext.h"
#include "libpq-fe.h"

[StdAfx.cpp]
//--- import library file for PostgreSQL ---
#pragma comment(lib, "libpqdll.lib")

実際に サーバ 192.168.10.1、データベース OrderData、ユーザ名 User、 パスワード UsrPWD で接続し、 テーブル tblSample から、Code、Item のフィールドを抽出する処理と、 テーブル tblData に対して INSERT命令によるデータ追加処理プログラムを 示します。


//-- データベースオープン
PGconn *conn = PQconnectdb("host=192.168.10.1 port=5432 "
                           "dbname=OrderData user=User password=UsrPWD");
if (PQstatus(conn) == CONNECTION_BAD) {
    AfxMessageBox(PQerrorMessage(conn));
    ErrorPostgres(conn);
}

//-- テーブルオープン
PGresult *res = PQexec(conn, "SELECT Code, Item FROM tblSample;");
if (res == NULL) ErrorPostgres(conn);

// SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
if (PQresultStatus(res) != PGRES_TUPLES_OK) ErrorPostgres(conn);

int iCode;                  // Codeデータを格納する変数
CString sItem;              // Itemデータを格納する変数
for (int i = 0; i < PQntuples(res); i++) {
    iCode = atoi((char *)PQgetvalue(res, i, 0));
    sItem = (char *)PQgetvalue(res, i, 1);
    //
    // ... その他必要な処理
    //
}
// PQexecを使用した場合、不要になった時点で結果セットをクリア
PQclear(res);

// 続いて tblData にデータを追加する
LPCSTR lpSQL = "INSERT INTO tblData(Code,Order,OrdDate) "
               "VALUES(100, 'VC++解説テキスト', now());";
res = PQexec(conn, lpSQL);

// INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
    MessageBox(sSQL, "INSERT COMMAND IS FAILED.");
}
// 値セットが無い場合でも必ず結果をクリアする
PQclear(res);

// その他 PGconn 変数 conn を用いて他のテーブル操作を実行可能
// ...

// 最後必ずデータベースとの接続を閉じる
PQfinish(conn);

基本的には上記手続きで、PostgreSQLのデータを操作することが出来ます。 データベースから得られる戻り値は、データベース内に格納されている形式によらず すべて文字列へのポインタとして返されます。ですから、 (char *)PQgetvalue(...) と戻り値を キャストして扱わなければなりません。 更に数値型変数に代入するためには、上記のようにatoi()関数を使用する必要が あります。また、結果セットを返さない PQexec()関数を実行した後も、内部的に 結果を保持するメモリーが確保されるため、必ず PQclear()関数をコールする必要が あります。


トランザクション操作を行う場合には、特別なコマンドを用いるのではなく、 PQexec()関数の引数に、"BEGIN"、"COMMIT"、"ROLLBACK" を使用します。具体的には


// トランザクションの開始
res = PQexec(conn, "BEGIN");

// トランザクションの実行状況を戻り値でチェックする
if (PQresultStatus(res) != PGRES_COMMAND_OK)   // ...
PQclear(res);                      // 必ず結果を処理する

// 実際の更新処理を行う
res = PQexec(conn, "INSERT ......");
    ....
res = PQexec(conn, "UPDATE ......");
    ....

// トランザクションをコミット(ロールバック)する
res = PQexec(conn, "COMMIT");      // PQexec(conn, "ROLLBACK");
PQclear(res);





TOMOsan Top Page に戻る
パソコン・プログラミングに戻る


Copyright(c) 2001 Tomohiko Saito. All rights reserved.
last update :