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工具。
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.
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);
}
@Eric,你能否详细说明一下你在Windows上使libpq正常工作的步骤。以教程式的方式来完成此任务将会很有帮助。非常感谢您提前的帮助 :)
- HelloWorld123456789