2011-05-31 45 views
1

我有一個C程序與postgresql上的localhost數據庫連接時出現問題。代碼看起來類似於這樣的:libpq-fe.h和c程序關閉

#include <stdio.h> 
#include <libpq-fe.h> 

int main() { 

int dane; 
PGconn *dbh; // definujemy uchwyt do bazy – jest to specjalna zmienna pamiętająca 
PGresult *wynik ; //wskaźnik do struktury przechowującej wynik zapytania 

dbh = PQconnectdb("dbname=lab1 user=postgres"); 
// teraz sprawdźmy statud połączenia: 
if (PQstatus(dbh) == CONNECTION_OK) 
{ 

    printf("Jest polaczenie z baza \n"); 
// tu będziemy wpisywali całą obsluge bazy danych 
wynik = PQexec(dbh,"INSERT INTO osoba(imie,nazw) VALUES('Jan','Kowalski')"); 
// wyswietlmy status z serwera 
//printf(„%s\n」,PQresStatus(wynik)); 

switch(PQresultStatus(wynik)) 
{ 
    case PGRES_TUPLES_OK: 
    // jeśli zapytanie zwroci dane to tutaj je sprawdzimy 
    break; 
    case PGRES_COMMAND_OK: 
    // nie ma danych 
    printf("Zapytanie sie powiodlo \n"); 
    break; 
    case PGRES_EMPTY_QUERY: 
    printf ("Serwer nie mial nic do roboty , moze blad ?\n"); 
    break; 
    case PGRES_NONFATAL_ERROR: 
    printf("Blad niekrytyczny, sprobuj ponowic zapytanie\n"); 
    break; 
    case PGRES_FATAL_ERROR: 
    default: 
    printf("Blad krytyczny \n"); 
    // wyswietlmy status bledu 
    printf("%s\n",PQresultErrorMessage(wynik)); 
} 

// wyczyscmy wynik o ile jest 
PQclear(wynik); 
// teraz rozłączmy sie z bazą 
PQfinish(dbh); 

} else { printf("No connection..\n"); } 

getch(); 
return 0; 

} 

當我運行這個程序時,它自動關閉,沒有任何提示。我不能用任何東西來阻止它,比如getch(),getchar()或system(「PAUSE」)。當我刪除上面的變量時聲明程序運行沒事。有什麼問題?

+0

您的程序是否提供任何輸出?如果您沒有機會閱讀,請從終端/ DOS提示符運行它。 – Eelke 2011-05-31 19:55:30

+0

當我嘗試從cmd.exe運行它會給出錯誤 - 無法讀取DLL庫.. – Kamil 2011-05-31 20:00:14

回答

2

所需的DLL全部位於postgresql安裝的bin文件夾中。通常爲c:\ program files \ postgresql \ 9.0 \ bin

這些DLL必須位於搜索路徑中或與您的可執行文件位於相同的文件夾中。相關的DLL是:COMERR32.DLL,GSSAPI32.DLL,K5SPRT32.DLL,KRB5​​_32.DLL,LIBEAY32.DLL,LIBICONV2.DLL,LIBINTL3.DLL,LIBPQ.DLL和SSLEAY32.DLL。

1

我建議用調試器逐步執行代碼。

如果沒有,請使用適當的打印語句加載它。例如:

int main() 
{ 
    PGconn *dbh = PQconnectdb("dbname=lab1 user=postgres"); 
    fputs("After PQconnectdb()\n", stderr); 
    int status = PQstatus(dbh); // C99 
    fputs("After PQstatus()\n"); 
    if (status == CONNECTION_OK) 
    { 
     PGresult *wynik = PQexec(dbh,"INSERT INTO osoba(imie,nazw) VALUES('Jan','Kowalski')"); 
     fputs("After PQexec()\n", stderr); 
     ... 
    } 
    ... 
} 

使用fputs()stderr通常確保消息不被緩衝,讓你看到他們,即使程序崩潰;寫入stdout並不總是發生這種情況。

我假設PQstatus()返回一個整數,因爲這些值在switch語句中使用。

+0

好吧我試過了,它表明我沒有在我的機器上libpq.dll,maybie你可以告訴我如何在dev cpp中正確包含libpq-fe庫? – Kamil 2011-05-31 20:21:03

+1

@Kamil:我不知道如何在Windows上安裝PostgreSQL。轉到[PostgreSQL](http://www.postgresql.org/)網站查找。 – 2011-05-31 20:30:35