适用于PostgreSQL的优秀C/C++连接器库

siv*_*udh 32 c++ postgresql

我的应用程序是商业GIS C++应用程序,我正在寻找一个强大/易于使用的Postgresq连接器.(旁注:我也计划使用PostGIS)

根据您的经验,有没有人有任何建议?如果你尝试过各种各样的话,那就更好了.

我看过:

  1. Postgres的C客户端
  2. pqxx
  3. QSQL

编辑 此外,有谁知道什么是一个很好的管理GUI工具?我在这里看到一个社区列表.但是有这么多!我正在开发Windows,不介意支付商业工具.另一个Stackoverflow帖子中有人建议使用Maestro.

joe*_*joe 29

libpq ++ 是一个为PostgreSQL提供非常好的连接器

SQLAPI ++是一个用于访问多个SQL数据库的C++库(Oracle,SQL Server,DB2,Sybase,Informix,InterBase,SQLBase,MySQL,PostgreSQL和ODBC,SQLite).

Abstract Database Connector是一个C/C++库,用于连接多个数据库(MySQL,mSQL,PostgreSQL,Interbase,Informix,BDE,ODBC).它在Linux,UNIX,BeOS和Windows上运行,并且正在开发用于ELF OS的动态驱动程序加载程序

Navicat是PostgrSQL的Nice GUI工具

  • 注意:**SQLAPI++** 不是免费的**,抽象数据库连接器和 libpq++ 已经死了,libpqxx 纯粹是垃圾。 (7认同)
  • SQLAPI ++是一种需要许可证的共享产品. (2认同)

ova*_*nes 15

看看SOCI.是Boost软件许可证下的开源库(根本是非限制性许可证之一).

这个lib专为C++而设计,其思想是通用编程和类型安全.

社会网站

此致,
Ovanes


Eri*_*ric 7

我根据需要为libpq编写了一个包装器.我是一个很长一段时间Zeoslib(http://sourceforge.net/projects/zeoslib/),但他们最后使用它们时遇到问题,不支持缓存数据集和简单慢.

libpq非常非常快.

我只需下载Windows版本的Postgres,将所有DLL复制到lib目录并导出调用,包括.h和相应的链接.

我意识到这是非常低的水平,但我无法强调我已经意识到的性能提升.

我们的应用程序是一个会计/ ERP类型的业务应用程序,具有相当大的安装基础,一些具有相当大的并发许多用户群(60,100个连接)......这对我们非常有用...如果你想要更多细节你可以回复关于如何包装libpq和处理缓存更新.

UPDATE:  
Run Code Online (Sandbox Code Playgroud)

根据请求,这里是包装libpq或直接在windows下使用它的步骤.

首先,对于水平集,我现在使用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.  
Run Code Online (Sandbox Code Playgroud)

您不需要使用MSI构建来安装PostgreSQL来获取这些DLL,尽管这也可以.我从二进制构建中复制了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
Run Code Online (Sandbox Code Playgroud)

现在应该在与DLL相同的目录中有一个libpq.lib文件.

3.  build the test program (or any program) as follows:
    bcc32 test.c -l libpq.lib
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

现在要访问PostgreSQL系统,我只需将libpq.lib文件复制到任何新的RAD-XE项目中,并将libpq.lib添加到项目中.我已将libpq包装到数据库传输驱动程序中,该驱动程序将我的数据库访问代码分开.

下面的屏幕截图显示了一个名为ptidb的RAD-XE项目,该项目反过来使用libpq来提供PostgreSQL支持.我也支持SQLite,除了SQLite我只是直接编译数据库.

然后我简单地发送上面列出的DLL以及我的最终产品,确保DLL与我的产品在同一目录中.

这应该让你去.如果你对我做的C++包装也感兴趣,请告诉我,我会发布一些其他的更新.

在此输入图像描述