2009-07-16 80 views
29

Ứng dụng của tôi là một ứng dụng GIS C++ thương mại và tôi đang tìm kiếm một trình kết nối mạnh mẽ/dễ sử dụng cho Postgresq. (Lưu ý bên: Tôi cũng định sử dụng PostGIS)Thư viện trình kết nối C/C++ tốt cho PostgreSQL

Có ai có bất kỳ đề xuất nào dựa trên kinh nghiệm của bạn không? Một cộng thêm sẽ là nếu bạn đã thử nhiều cái khác nhau.

tôi đã xem xét:

  1. Postgres's C client
  2. pqxx
  3. QSql

EDIT Ngoài ra, không ai biết một quản trị công cụ GUI tốt là những gì? Tôi thấy danh sách cộng đồng here. Nhưng có rất nhiều! Tôi đang phát triển trên Windows và không ngại trả tiền cho các công cụ thương mại. Một người nào đó trong một bài đăng Stackoverflow khác được đề xuất Maestro.

Trả lời

28

libpq++ là một trong những cung cấp kết nối rất tốt cho PostgreSQL

SQLAPI++ là một Thư viện C++ để truy cập vào nhiều cơ sở dữ liệu SQL (Oracle, SQL Server, DB2, Sybase, Informix, Interbase, SQLBase, MySQL, PostgreSQL và ODBC, SQLite).

Abstract Database Connector là thư viện C/C++ để tạo kết nối tới một số cơ sở dữ liệu (MySQL, mSQL, PostgreSQL, Interbase, Informix, BDE, ODBC). Nó chạy trên Linux, UNIX, BeOS, và Windows, và một bộ nạp tài xế động cho ELF hệ điều hành đang được phát triển

Navicat là công cụ GUI đẹp cho PostgrSQL

+1

Bạn có yêu thích trong số tất cả những cái bạn đã liệt kê không? – sivabudh

+1

Tôi đã sử dụng tất cả chúng trong các tình huống khác nhau – joe

+2

SQLAPI ++ là sản phẩm phần mềm yêu cầu giấy phép. – tadman

11

Hãy xem SOCI. Là một lib nguồn mở theo Giấy phép Phần mềm Tăng cường (một trong những giấy phép không hạn chế nhất).

lib này được thiết kế đặc biệt cho C++ với ý tưởng về lập trình chung và loại an toàn trong tâm trí.

SOCI Site

Kính trọng,
Ovanes

6

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ó.

enter image description here

+1

Yêu cầu từ người dùng mới [Nghệ thuật] (http://stackoverflow.com/users/3370421/art): '@Eric, bạn vui lòng xây dựng một chút về các bước bạn đã thực hiện để libpq hoạt động bình thường trên Windows hay không. Một cách tiếp cận hướng dẫn cho nhiệm vụ sẽ giúp ích rất nhiều. cảm ơn trước rất nhiều:) ' –

Các vấn đề liên quan