2009-07-16 8 views
29

私のアプリケーションは商用GIS C++アプリケーションです。Postgreq用の堅牢で使いやすいコネクタを探しています。 (注:私もPostGISを使用する予定です)PostgreSQL用のC/C++コネクタライブラリ

あなたの経験に基づいて推奨する人はいますか?あなたがいろいろ試してみたらプラスになるでしょう。私が見てきました

  1. Postgres's C client
  2. pqxx
  3. QSql

EDIT また、誰もが良い管理GUIツール何を知っていますか?コミュニティリストhereが表示されます。しかし、とてもたくさんあります!私はWindows上で開発していますが、商用ツールについては心配していません。 別のStackoverflow投稿の誰かがMaestroを提案しました。

答えて

28

libpq++は、1つのPostgreSQLの

SQLAPI++のために非常に優れたコネクタを提供であるC++複数のSQLデータベースにアクセスするためのライブラリ(オラクル、SQLサーバ、DB2、Sybaseの、Informixの、InterBaseの、SQLBaseは、MySQL、PostgreSQLとODBC、SQLiteのです)。

Abstract Database Connectorは、いくつかのデータベース(MySQL、mSQL、PostgreSQL、Interbase、Informix、BDE、ODBC)に接続するためのC/C++ライブラリです。これは、Linux、UNIX、BeOSの、およびWindows上で動作し、ELFのOS用のダイナミックドライバーローダーは開発中の

NavicatあるPostgrSQL

+1

あなたが列挙されているもののすべての間で人気がありますか? – sivabudh

+1

私はそれらをすべて別の状況で使用しました – joe

+2

SQLAPI ++は、ライセンスが必要なシェアウェア製品です。 – tadman

11

はSOCIを見てみましょうためのニースのGUIツールです。 Boost Software Licenseの下にあるオープンソースのlib(ほとんど制限のないライセンスの1つ)です。

このlibは、一般的なプログラミングと型の安全を念頭に置いて、特にC++用に設計されています。

SOCI Site

よろしく、
Ovanes

6

私は、私たちのニーズにlibpqのラッパーを書きました。私は長い間、Zeoslib(http://sourceforge.net/projects/zeoslib/)でしたが、最後に問題を抱えていました。キャッシュされたデータセットをサポートしていないし、遅いです。

libpqは非常に高速です。

私は単純にPostgresのWindows版をダウンロードし、すべてのDLLをlibディレクトリにコピーして呼び出しをエクスポートし、それに応じて.hとリンクをインクルードします。

私はこれが非常に低いレベルであることを認識していますが、私が結果として実現しているパフォーマンスの向上を十分に強調することはできません。

私たちのアプリケーションはかなり大きなインストールベースを持つ会計/ ERPタイプのビジネスアプリケーションであり、相当数の同時並行した多数のユーザーベース(60,100接続)...これは非常にうまくいっています... libpqをどのようにラップし、キャッシュされた更新を処理するかについての詳細が必要です。ここでは、要求から

UPDATE: 

はlibpqのラップまたは直接の窓の下にそれを利用する手順は次のとおりです。

まず、レベルを設定するために、私はEmbarcadero RAD XEを使用しています。そのため、以下のコマンドはRAD XEに付属のコマンドラインツールです。コマンドラインツールがPATH環境変数に含まれていない場合は、それも必ず確認する必要があります。 Visual Studioを使用している場合は、同等のコマンドを実行する必要があります。基本的に私は.DLLから.libファイルを作成しています

TEST.Cは私がlibpqの使い方を理解し、また私の成功をテストするために書いた最小限のテストコードです。

1. Put all the DLLs into a directory and copy the include directory. 

これらのDLLを取得するには、MSIビルドを使用してPostgreSQLをインストールする必要はありませんが、これも機能します。バイナリビルドからDLLをコピーしました。 .Hファイルもバイナリビルドから取得されました。だから私のディレクトリは次のようになります:

include\ 
    libpq-fe.h 
    postgres_ext.h 
    libeay32.dll 
    libiconv-2.dll 
    libintl-8.dll 
    libpq.dll 
    ssleay32.dll 
    zlib1.dll 



2. Create an import library against LIBPQ.DLL as follows: 
    implib -c -a libpq.lib libpq.dll 

は、DLLと同じディレクトリにlibpq.libファイルを持つはずです。

3. build the test program (or any program) as follows: 
    bcc32 test.c -l libpq.lib 

私は単純にすべての新しいRAD-XEプロジェクトにlibpq.libファイルをコピーし、プロジェクトにlibpq.libを追加PostgreSQLのシステムにアクセスするためのtest.cの今

#include <stdio.h> 
#include "include/libpq-fe.h" 


char *db  = "mydatabasename"; 
char *dbserver = "hostname"; 
char *uname = "username"; 
char *pass  = "password"; 

char *SQL  = "select * from public.auditlog;"; 
// char *SQL  = "select userid, stationid from public.auditlog"; 

char  buff[200]; 
PGconn *dbconn; 
PGresult *res; 

void main(void) 
{ 
int nFields, i, j; 

    printf("Attempting to Connect to Database Server:\n"); 
    printf("Database: %s\n", db); 
    printf("Server : %s\n", dbserver); 

    sprintf(buff, "dbname=%s host=%s port=5432 user=%s password=%s", 
       db, dbserver, uname, pass); 

    dbconn = PQconnectdb(buff); 

    if(PQstatus(dbconn) != CONNECTION_OK) 
    printf("Connection Failed: %s\n", PQerrorMessage(dbconn)); 
    else 
    { 
    printf("Connected Successfully!\n"); 

    sprintf(buff, "BEGIN; DECLARE my_portal CURSOR FOR %s", SQL); 

    res = PQexec(dbconn, buff); 
    if(PQresultStatus(res) != PGRES_COMMAND_OK) 
    { 
     printf("Error executing SQL!: %s\n", PQerrorMessage(dbconn)); 
     PQclear(res); 
    } 
    else 
    { 
     PQclear(res); 
     res = PQexec(dbconn, "FETCH ALL in my_portal"); 

     if(PQresultStatus(res) != PGRES_TUPLES_OK) 
     { 
     printf("ERROR, Fetch All Failed: %s", PQerrorMessage(dbconn)); 
     PQclear(res); 
     } 
     else 
     { 
     nFields = PQnfields(res); 

     // Print out the field names 
     for(i=0; i<nFields; i++) 
      printf("%-15s", PQfname(res, i)); 

     printf("\n"); 

     // Print out the rows 
     for(i=0; i<PQntuples(res); i++) 
     { 
      for(j=0; j<nFields; j++) 
      printf("%-15s", PQgetvalue(res, i, j)); 

      printf("\n"); 
     } 

     res = PQexec(dbconn, "END"); 
     PQclear(res); 
     } 
    } 

    } 


    PQfinish(dbconn); 
} 

。私はデータベース転送ドライバにlibpqをラップして、私のデータベースアクセスコードを分けています。

次のスクリーンショットは、libpqを使用してPostgreSQLサポートを提供するptidbというRAD-XEプロジェクトを示しています。私はSQLiteをサポートしていますが、データベースを直接コンパイルするだけです。

次に、上記のDLLと、最終製品と一緒に、DLLが私の製品と同じディレクトリにあることを確認します。

これはあなたに行くはずです。あなたがC++のラッピングに興味があるなら、私に知らせてください。そして私はいくつかのもので別のアップデートを投稿します。

enter image description here

+1

新しいユーザーからのリクエスト[Art](http://stackoverflow.com/users/3370421/art): '@Eric、Windowsでlibpqを正しく動作させるために取った手順をちょっと説明してください。タスクへのチュートリアルアプローチは、多くの助けになります。ありがとうございます。) –

関連する問題