libpq-fe.h и c закрытие программы - PullRequest
1 голос
/ 31 мая 2011

У меня проблема с программой на C, которая соединяется с базой данных localhost на postgresql. Код выглядит примерно так:

#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"). Когда я удаляю все вышеперечисленное, программа объявления переменных работает нормально. В чем проблема?

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Все необходимые DLL находятся в папке bin вашей установки postgresql. Обычно 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 голос
/ 01 июня 2011

Я предлагаю пройтись по коду с помощью отладчика.

В противном случае загрузите его с соответствующими инструкциями печати.Например:

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.

...