我遇到了一个与postgresql上的localhost数据库连接的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 :(得分: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 :(得分: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
语句中使用的。