一、简介
Libpq 是应用程序员使用 HGDB 的 C 接口。libpq 是一个库函数的集合,它们允许客户端程序传递查询给 HGDB 后端服务器并且接收这些查询的结果。
libpq库是PostgreSQL的C接口。它是一组库函数,允许客户端程序与PostgreSQL交互。它也是其他PostgreSQL应用程序接口的基础引擎,包括为C++、Perl、PHP、Ruby、Python和Tcl编写的应用程序接口。
Libpq可能大家以前没有接触甚至没有听说,那么其实他和jdbc是一个东西,JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。要在特定数据库中使用JDBC,我们需要该数据库的JDBC驱动程序。
注意:使用 libpq 的客户端程序必须包括头文件 libpq-fe.h 并必须与 libpq 库链接在一起。
二、用途
简单地说,Libpq 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。下列代码段给出了以上三步的基本示例:
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
void do_exit(PGconn *conn) {
PQfinish(conn);
exit(1);
}
int main() {
//连接数据库,给出字符串
PGconn *conn = PQconnectdb("user=highgo dbname=highgo password=highgo123");
//返回链接信息
if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr, "Connection to database failed: %s\n",
PQerrorMessage(conn));
do_exit(conn);
}
else{
printf(‘连接成功’);
}
//获取数据表结果
PGresult *res = PQexec(conn, "SELECT * FROM Cars LIMIT 5");
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
printf("No data retrieved\n");
PQclear(res);
do_exit(conn);
}
//将查询结果输出
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);
PQfinish(conn);
return 0;
}
三、增删改查示例
这是我们对数据库进行的最基本的也是最多的操作,下面给到每一个例子以及用到的函数分析。
#include <stdio.h>
#include <libpq-fe.h>
int main(void)
{
//连接数据库
const char*
conninfo="host=localhost user=highgo dbname=highgo password=ls123456";
PGconn* conn=PQconnectdb(conninfo);
if(PQstatus(conn)==CONNECTION_BAD)
{
printf("failed to connect database!");
PQfinish(conn);
return 1;
}
//创建表,插入数
PGresult *res=PQexec(conn,"create table student (id int,name text)");
if(PQresultStatus(res)!=PGRES_COMMAND_OK){
printf("create failed!%s \n",PQresultErrorMessage(res));
}
PQclear(res);
res=PQexec(conn,"insert into student values(1,'hanjingyi')");
if(PQresultStatus(res)!=PGRES_COMMAND_OK){
printf("insert failed!\n");
}
PQclear(res);
res=PQexec(conn,"insert into student values(2,'liushun')");
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 i=PQntuples(res);
int t=PQnfields(res);
int s=0;
//循环取值
for(;s<i;s++)
{
int k=0;
for(;k<t;k++)
{
printf(“%s %s \n”,PQgetvalue(res,s,k));
}
}
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 0;
}
四、一些常用函数
Pqconnectdb 创建一个数据库连接
PGresult 封装查询的结果
PQexec()提交了一个sql命令到服务器然后等待结果。
PQresultStatus 返回该命令的结果状态。PGRES_COMMAND_OK一个不返回数据的命令成功完成。 PGRES_TUPLES_OK 一个返回数据的命令(例如 SELECT 或者 SHOW)成功完成。
PQntuples 返回查询结果中的行(元组)数。
PQnfields 返回查询结果中每一行的列(域)数。
PQgetvalue 返回一个 PGresult 的一行的单一域值。
PQclear 释放与一个 PGresult 相关的存储。每一个命令结果不再需要时应该用 PQclear 释放。