Libpq 接口

Libpq 是应用程序员使用瀚高数据库的 C 接口。Libpq 由相关库函数组成是一个库函数的集合,它们允许客户端程序传递查询给瀚高数据库后端服务器并且接收这些查询的结果。同时,Libpq 也是很多其他瀚高数据库应用接口的底层引擎,包括为 C++、Perl、Python、Tcl和 ECPG 编写的接口。

调用Libpq 库,同JAVA使用JDBC原理效果一样。

Libpq 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。

注意:使用 Libpq 的客户端程序必须包括头文件 libpq-fe.h 并必须与 libpq 库链接在一起。****

常用函数

函数名称 功能说明
PQconnectdb 创建一个数据库连接
PGresult 封装查询的结果
PQexec 提交了一个sql命令到服务器然后等待结果
PQresultStatus 返回该命令的结果状态。PGRES_COMMAND_OK一个不返回数据的命令成功完成。 PGRES_TUPLES_OK 一个返回数据的命令(例如 SELECT 或者 SHOW)成功完成
PQntuples 返回查询结果中的行(元组)数
PQnfields 返回查询结果中每一行的列(域)数
PQgetvalue 返回一个 PGresult 的一行的单一域值
PQclear 释放与一个 PGresult 相关的存储。每一个命令结果不再需要时应该用 PQclear 释放

下面详细介绍 Libpq 数据库连接,以windows环境、HGDB安全版V4.5.7为例。

开发环境搭建

软件 版本
HGDB 安全版V4、企业版v5及以上版本
IDE Qt Creator 4.10.1(Qt 5.13.2)

前提准备

(1)在项目工程目录下,新建文件夹hgsql(存放头文件及链接库):

image-20220510133933680

(2)打开瀚高数据库安装目录,将include和lib目录复制到工程目录下新建的hgsql文件夹下:

image-20220510134006403

(3)打开Libpq_Demo.pro文件,添加包含路径和静态链接库:

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");

//连接数据库
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;
}

//将查询结果输出
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();
}

执行结果:

image-20220429114900262

image-20220429115011623

注意事项

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

  • 根据官方文档,看下路径是否正确,如下:

Document

​ 1. unix写法比较通用,需要用-l标识库名称,-L标识库路径,在windows下,路径要用绝对路径,这个地方比较关键。

​ 2. 如果路径中有空格的话就用双引号包起来。

  • 针对于上面第一点,如果不想用绝对路径的话,用相对路径可以采用系统变量的方式,如下所示:
    LIBS += $$PWD/lib/xxx.lib //$$PWD当前工程目录

    image-20220429115923935

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

发生场景:在linux环境上配置.pro文件

image-20220607171210224

运行时提示如下错误

image-20220607164901273

原因是QT无法识别lib目录下的部分lib库文件格式,可以使用“ll”或者“ls -al”命令查看文件的指向类型

image-20220607170756010

从图中可以看出libpq.so.5.12是libpq.so和libpq.so.5的软连接

所以libpq.so.5.12是非.so文件,所以QT在加载lib目录时会把目录下的所有文件当成lib文件,不会以后缀名。

如果不想删除软连接,可以直接在.pro文件里把.so文件路径给出来就可以了

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