我的应用程序是一个商业GIS C ++应用程序,我正在寻找一个强大/易于使用的Postgresq连接器。 (旁注:我也计划使用PostGIS)
根据您的经验,有没有人有任何建议?如果你尝试了各种各样的话,那就更好了。
我看过:
修改 此外,有谁知道什么是一个很好的管理GUI工具?我看到了一个社区列表here。但是有这么多!我正在开发Windows,不介意支付商业工具。 另一个Stackoverflow帖子中有人建议Maestro。
答案 0 :(得分: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操作系统的动态驱动程序加载器正在开发中
Navicat是PostgrSQL的Nice GUI工具
答案 1 :(得分:13)
答案 2 :(得分:7)
我根据需要为libpq编写了一个包装器。我很长一段时间Zeoslib(http://sourceforge.net/projects/zeoslib/),但是在我使用它们之后,它们遇到了问题,不支持缓存数据集而且速度很慢。
libpq非常非常快。
我只需下载Windows版本的Postgres,将所有DLL复制到lib目录并导出调用,包括.h并相应地链接。
我意识到这是非常低的水平,但我无法强调我已经意识到的性能提升。
我们的应用程序是一个会计/ ERP类型的业务应用程序,具有相当大的安装基础,一些具有相当大的并发许多用户群(60,100个连接)......这对我们很有帮助...如果你可以回复想要了解我们如何包装libpq和处理缓存更新的更多细节。
UPDATE:
这里的请求是包装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.
您不需要使用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 ++包装也感兴趣,请告诉我,我会发布一些更新内容。