PostgreSQL的好用C/C++连接库

36

我的应用程序是一款商业GIS C++应用程序,我正在寻找一个稳健且易于使用的PostgreSQL连接器。(附注:我也打算使用PostGIS)

根据您的经验,是否有任何推荐?如果您尝试过各种连接器,那就更好了。

我已经看过:

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

编辑 此外,有没有人知道什么是好的管理员GUI工具?我在这里看到了一个社区列表(链接)。但是有很多!我正在Windows上开发,并且不介意为商业工具付费。另一篇Stackoverflow帖子中有人建议Maestro


请尝试使用 https://github.com/RKTUXYN/npgsql_wrapper。 - Rajib Chy
3个回答

32

libpq++是提供非常好的连接器用于PostgreSQL。

SQLAPI++是一个C++库,用于访问多个SQL数据库(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 OSes的动态驱动程序加载器正在开发中。

Navicat是用于PostgreSQL的不错的GUI工具。


1
你在列出的所有选项中有最喜欢的吗? - sivabudh
1
我在不同的情况下使用了它们所有。 - joe
4
SQLAPI++是一个共享软件产品,需要许可证才能使用。 - tadman
7
注意:SQLAPI++并不是免费的,Abstract Database Connector和libpq++已经停止维护,而libpqxx则极为糟糕。 - rustyx

18

看看SOCI。它是一个开源库,使用Boost软件许可证(最不受限制的许可证之一)。

这个库特别设计用于C++,考虑了泛型编程和类型安全性的思想。

SOCI网站


7
我为我们的需求编写了libpq的包装器。我很长一段时间都在使用Zeoslib (http://sourceforge.net/projects/zeoslib/),但是它们最后一次使用时存在很多问题,不支持缓存数据集且运行速度慢。

libpq非常快。

我只需要下载Postgres的Windows版本,将所有DLL文件复制到一个lib目录中,并导出调用,包含.h并进行链接即可。

我意识到这非常底层,但我无法强调由此实现的性能提升足够重要。

我们的应用程序是一个会计/ERP类型的商业应用程序,具有相当大的安装基础,一些客户拥有相当显著的并发用户基础(60、100个连接)...... 这对我们非常有帮助...... 如果您想要更多关于我们如何包装libpq和处理缓存更新的详细信息,请回复。

UPDATE:  

以下是针对一个请求的步骤,用于在Windows下包装libpq或直接使用它。

首先,我现在使用Embarcadero RAD XE,所以接下来的命令行工具是RAD XE附带的命令行工具。如果您使用Visual Studio,则需要解决相应的命令。基本上,我正在从.DLL文件中创建.lib文件。

TEST.C是我编写的最简测试代码,用于确保我了解如何使用libpq并测试我的成功。

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

您无需使用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

现在,您的DLL文件夹中应该有一个名为libpq.lib的文件。

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

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);
}

现在,要访问PostgreSQL系统,我只需将libpq.lib文件复制到任何新的RAD-XE项目中,并将libpq.lib添加到项目中。 我已经将libpq封装成了一个数据库传输驱动程序,以将我的数据库访问代码分离出来。
下面的屏幕截图显示了名为ptidb的RAD-XE项目,该项目使用libpq提供对PostgreSQL的支持。 我还支持SQLite,但是对于SQLite,我只需直接编译数据库。
然后,我只需将上面列出的DLL与我的最终产品一起发布,确保DLL与我的产品位于同一目录中。
这样就可以开始了。 如果您还对我所做的C ++封装感兴趣,请告诉我,我会发布另一个更新并介绍其中一些内容。 enter image description here

1
新用户 Art 提出请求: @Eric,你能否详细说明一下你在Windows上使libpq正常工作的步骤。以教程式的方式来完成此任务将会很有帮助。非常感谢您提前的帮助 :) - HelloWorld123456789

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接