转载请注明本文出处,LeonidasFlames的blog ,链接:Linux下PostgreSQL数据库C语言接口:libpq (二)
二、libpq库下C语言程序对PostgreSQL的访问
首先看一个程序示例:
#include
#include
using namespace std;
int main(void)
{
////////////数据库连接
const char* conninfo="hostaddr=127.0.0.1 user=Meme dbname=MyDatabase password=123";
PGconn* conn=PQconnectdb(conninfo);
if(PQstatus(conn)==CONNECTION_BAD)
{
cout<<"连接数据库失败!"<
1. 执行SQL语句函数
PGresult* PQexec(PGconn*conn, const char* query);返回查询的结果集
2.执行SQl语句函数,用于异步查询,可以得到多次查询结果
PQsendQuery(PQconn*conn, const char* query);
PQresult*res=PQgetResult(PQconn* );
3. 返回查询结果里的记录个数
int PQntuples(const PGresult*res);
4.返回记录里的字段个数
int PQnfields(const PGresult* res);
5.返回结果集中的某一字段名
char* PQfname(const PGresult* res, intfield_index);
6.返回结果集中的某一字段数据类型
Qid PQftype(const PGresult* res, intfield_index);
7. 返回结果集中的某一条记录中某一个字段的值
char* PQgetvalue(constPGresult* res, int tup_num, int field_num);
比如,您想取得结果集res的第2条记录的第3个字段,则
PQgetvalue(res,2,3); 即可,请注意,返回的值为char*类型,所以请注意数据的类型转换。如果期望的返回结果为int整型数据,则应该:
int value=atoi(PQgetvalue(res,2,3));
8. 返回命令的结果状态
ExecStatusType PQresultStatus( const PGresult * res);
ExecStatusType 类型定义为:
(1)PGRES_TUPLES_OK 成功执行查询,用于可以从res中提取元组信息的执行查询,如SELECT语句的结果判断。
(2)PGRES_COMMAND_OK 成功完成一个无数据命令,用于不返回元组信息的执行查询,如INSERT、UPDATE、DELETE等。
注意:PGRES_COMMAND_OK无法判断SQL语句在数据库中是否增删改数据。
比如:DELETE FROM tab_user WHERE id=1001如果未查询到id=1001的数据(可能是误操作,或者是id参数传参错误),则删除操作必然没有影响数据库实际数据,PQresultStatus返回的结果依然是PGRES_COMMAND_OK。
(3)PGRES_EMPTY_QUERY 发送给后端的字串为空
(4)PGRES_BAD_RESPONSE 服务器响应无法理解
9. 通常只返回命令的名字,可能包括额外的数据,如处理过的行数。可以用此来判断一个无数据返回的SQL命令是否生效。
char* PQcmdStatus(const PGresult* res);
比如一个UPDATE查询,可以通过PQcmdStatus的返回结果中的影响行数来判断,是否更新数据成功,这一点是不能用PQresultStatus函数分辨出的。
返回产生PGresult的SQL命令的命令状态字符串。
若UPDATE的影响行数为0,则应该返回的是”UPDATE 0”字符串。
10. 返回被SQL命令影响的行的数量
char* PQcmdTuples(const PGresult* res);
其中res指INSERT、UPDATE和DELETE命令返回涉及的行数,其他命令则返回空字符串。用途和上一条差不多,只是不返回命令名字,仅仅返回影响行数。
11. 用于返回访问的出错信息,比如一些操作违反了主键、外键、唯一约束等等。可以讲返回的char*数据打印以分析出错原因。
char* PQresultErrorMessage(PGresult* res);
12.返回一个错误字段标识符
char* PQresultErrorField(PGresult* res, intfieldcode);
13. 清除结果集PGresult*res的数据,res可以再次用于下一次查询。
void PQclear(PGresult *res);