Tôi đã viết một wrapper xung quanh libpq cho các nhu cầu của chúng tôi. Tôi đã được một thời gian dài Zeoslib (http://sourceforge.net/projects/zeoslib/) nhưng họ đã được riped với các vấn đề cuối cùng tôi sử dụng chúng, không hỗ trợ bộ nhớ cache dữ liệu và đồng bằng chậm.
libpq rất, rất nhanh.
Tôi chỉ cần tải xuống phiên bản Windows của Postgres, sao chép tất cả các tệp DLL vào thư mục lib và xuất các cuộc gọi, bao gồm .h và liên kết tương ứng.
Tôi nhận thấy mức này rất thấp nhưng tôi không thể nhấn mạnh đủ mức tăng hiệu suất mà tôi nhận ra là kết quả. Ứng dụng của chúng tôi là một ứng dụng kinh doanh kế toán/ERP với cơ sở cài đặt khá lớn với một số cơ sở người dùng đồng thời khá đáng kể (60, 100 kết nối) ... Điều này đã phục vụ rất tốt ... Bạn có thể trả lời nếu bạn muốn biết thêm chi tiết về cách chúng tôi bọc libpq và xử lý các bản cập nhật được lưu trong bộ nhớ cache.
UPDATE:
Từ yêu cầu ở đây là các bước để bọc libpq hoặc sử dụng trực tiếp dưới cửa sổ.
Đầu tiên, để thiết lập mức độ, tôi sử dụng Embarcadero RAD XE những ngày này để các lệnh theo sau là các công cụ dòng lệnh đi kèm với RAD XE. Bạn cũng cần đảm bảo rằng các công cụ dòng lệnh của bạn nằm trong biến môi trường PATH nếu chưa có. Nếu sử dụng Visual Studio, sau đó bạn sẽ phải làm việc ra các lệnh tương đương. Về cơ bản tôi đang tạo một tệp .lib trong số .DLL
TEST.C là mã thử nghiệm tối giản mà tôi đã viết để đảm bảo rằng tôi hiểu cách sử dụng libpq và cũng để kiểm tra thành công của mình.
1. Put all the DLLs into a directory and copy the include directory.
Bạn không cần phải cài đặt PostgreSQL bằng cách sử dụng trình tạo MSI để nhận các tệp DLL này, mặc dù điều đó cũng sẽ hoạt động. Tôi đã sao chép các tệp DLL từ bản dựng nhị phân. Các tệp .H cũng được lấy từ bản dựng nhị phân. Vì vậy, thư mục của tôi trông giống như sau:
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
bây giờ sẽ có tệp libpq.lib trong cùng thư mục với tệp DLL của bạn.
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);
}
Bây giờ để truy cập vào một hệ thống PostgreSQL tôi chỉ cần sao chép các tập tin libpq.lib vào bất kỳ dự án RAD-XE mới và thêm libpq.lib cho dự án. Tôi đã gói libpq vào một trình điều khiển truyền tải cơ sở dữ liệu phân loại tách mã truy cập cơ sở dữ liệu của tôi.
Ảnh chụp màn hình sau đây cho thấy một dự án RAD-XE được gọi là ptidb, đến lượt nó, sử dụng libpq để cung cấp hỗ trợ PostgreSQL. Tôi cũng hỗ trợ SQLite ngoại trừ với SQLite Tôi chỉ biên dịch cơ sở dữ liệu trực tiếp.
Sau đó, tôi chỉ đơn giản là gửi các tệp DLL, được liệt kê ở trên, cùng với sản phẩm cuối cùng của tôi đảm bảo các tệp DLL cuộn lên trong cùng thư mục với sản phẩm của tôi.
Điều này sẽ giúp bạn tiếp tục. Nếu bạn cũng quan tâm đến gói C++ tôi làm, hãy cho tôi biết và tôi sẽ đăng một bản cập nhật khác với một số của nó.
Bạn có yêu thích trong số tất cả những cái bạn đã liệt kê không? – sivabudh
Tôi đã sử dụng tất cả chúng trong các tình huống khác nhau – joe
SQLAPI ++ là sản phẩm phần mềm yêu cầu giấy phép. – tadman