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 に戻る
パソコン・プログラミングに戻る