Libpq 接口

Libpq 是應(yīng)用程序員使用瀚高數(shù)據(jù)庫的 C 接口。Libpq 由相關(guān)庫函數(shù)組成是一個庫函數(shù)的集合,它們允許客戶端程序傳遞查詢給瀚高數(shù)據(jù)庫后端服務(wù)器并且接收這些查詢的結(jié)果。同時,Libpq 也是很多其他瀚高數(shù)據(jù)庫應(yīng)用接口的底層引擎,包括為 C++、Perl、Python、Tcl和 ECPG 編寫的接口。

調(diào)用Libpq 庫,同JAVA使用JDBC原理效果一樣。

Libpq 可做三件事:與數(shù)據(jù)庫建立連接、發(fā)送 操作數(shù)據(jù)庫的語句并處理結(jié)果。

注意:使用 Libpq 的客戶端程序必須包括頭文件 libpq-fe.h 并必須與 libpq 庫鏈接在一起。****

常用函數(shù)

函數(shù)名稱 功能說明
PQconnectdb 創(chuàng)建一個數(shù)據(jù)庫連接
PGresult 封裝查詢的結(jié)果
PQexec 提交了一個sql命令到服務(wù)器然后等待結(jié)果
PQresultStatus 返回該命令的結(jié)果狀態(tài)。PGRES_COMMAND_OK一個不返回數(shù)據(jù)的命令成功完成。 PGRES_TUPLES_OK 一個返回數(shù)據(jù)的命令(例如 SELECT 或者 SHOW)成功完成
PQntuples 返回查詢結(jié)果中的行(元組)數(shù)
PQnfields 返回查詢結(jié)果中每一行的列(域)數(shù)
PQgetvalue 返回一個 PGresult 的一行的單一域值
PQclear 釋放與一個 PGresult 相關(guān)的存儲。每一個命令結(jié)果不再需要時應(yīng)該用 PQclear 釋放

下面詳細(xì)介紹 Libpq 數(shù)據(jù)庫連接,以windows環(huán)境、HGDB安全版V4.5.7為例。

開發(fā)環(huán)境搭建

軟件 版本
HGDB 安全版V4、企業(yè)版v5及以上版本
IDE Qt Creator 4.10.1(Qt 5.13.2)

前提準(zhǔn)備

(1)在項目工程目錄下,新建文件夾hgsql(存放頭文件及鏈接庫):

image-20220510133933680

(2)打開瀚高數(shù)據(jù)庫安裝目錄,將include和lib目錄復(fù)制到工程目錄下新建的hgsql文件夾下:

image-20220510134006403

(3)打開Libpq_Demo.pro文件,添加包含路徑和靜態(tài)鏈接庫:

image-20220510154715695

示例代碼

main.cpp

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

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

printf("Hello World!\n");

//連接數(shù)據(jù)庫
const char* conninfo="host=192.168.2.5 port=5866 user=test dbname=test password=test";
PGconn* conn=PQconnectdb(conninfo);
if(PQstatus(conn)==CONNECTION_BAD)
{
printf("failed to connect database!");
PQfinish(conn);
return 1;
}

//插入shuju
PGresult *res=PQexec(conn,"insert into student (name,age) values('hanjingyi',23)");
if(PQresultStatus(res)!=PGRES_COMMAND_OK)
{
printf("insert failed!\n");
}
PQclear(res);

res=PQexec(conn,"insert into student (name,age) values('liushun',25)");
if(PQresultStatus(res)!=PGRES_COMMAND_OK)
{
printf("insert failed\n!");
}
PQclear(res);

//查詢操作
res=PQexec(conn,"SELECT * FROM student");
if(PQresultStatus(res)!=PGRES_TUPLES_OK)
{
printf("SELECT failed!");
PQresultErrorMessage(res);
PQclear(res);
return 1;
}

//將查詢結(jié)果輸出
int rows = PQntuples(res);
for(int i=0; i<rows; i++) {
printf("%s %s %s\n", PQgetvalue(res, i, 0),
PQgetvalue(res, i, 1),PQgetvalue(res, i, 2));
}
PQclear(res);

//刪除操作
res=PQexec(conn,"DELETE FROM student WHERE id=3");
if(PQresultStatus(res)!=PGRES_COMMAND_OK)
{
printf("DELETE executed failed!%s,\n",PQresultErrorMessage(res));
PQresultErrorMessage(res);
PQclear(res);
return 1;
}
else
{
printf("DELETE operation executed succeed!\n");
PQclear(res);
}

return a.exec();
}

執(zhí)行結(jié)果:

image-20220429114900262

image-20220429115011623

注意事項

1、配置了LIBS后提示:LINK : fatal error LNK1104: 無法打開文件“xxx.lib”,解決方案如下:

  • 根據(jù)官方文檔,看下路徑是否正確,如下:

Document

? 1. unix寫法比較通用,需要用-l標(biāo)識庫名稱,-L標(biāo)識庫路徑,在windows下,路徑要用絕對路徑,這個地方比較關(guān)鍵。

? 2. 如果路徑中有空格的話就用雙引號包起來。

  • 針對于上面第一點(diǎn),如果不想用絕對路徑的話,用相對路徑可以采用系統(tǒng)變量的方式,如下所示:
    LIBS += $$PWD/lib/xxx.lib //$$PWD當(dāng)前工程目錄

    image-20220429115923935

2、配置了LIBS后提示:cannoe find /opt/HighGo4.5.7-see/lib:File format not recognized,解決方案如下:

發(fā)生場景:在linux環(huán)境上配置.pro文件

image-20220607171210224

運(yùn)行時提示如下錯誤

image-20220607164901273

原因是QT無法識別lib目錄下的部分lib庫文件格式,可以使用“l(fā)l”或者“l(fā)s -al”命令查看文件的指向類型

image-20220607170756010

從圖中可以看出libpq.so.5.12是libpq.so和libpq.so.5的軟連接

所以libpq.so.5.12是非.so文件,所以QT在加載lib目錄時會把目錄下的所有文件當(dāng)成lib文件,不會以后綴名。

如果不想刪除軟連接,可以直接在.pro文件里把.so文件路徑給出來就可以了

LIBS += /opt/HighGo4.5.7-see/lib/libpg.so.5