Linux下PostgresQL数据库C语言接口:libpq (二)数据库访问

来源:互联网 发布:苹果鼠标怎么连接mac 编辑:程序博客网 时间:2024/05/01 11:50

转载请注明本文出处,LeonidasFlames的blog ,链接:Linux下PostgreSQL数据库C语言接口:libpq (二)

 

二、libpq库下C语言程序对PostgreSQL的访问

 

首先看一个程序示例:

#include <iostream>#include <libpq-fe.h>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<<"连接数据库失败!"<<endl;PQfinish(conn);return 1;}////////////数据库SELECT查询PGresult* res=PQexec(conn,"SELECT *FROM student");if(PQresultStatus(res)!=PGRES_TUPLES_OK){cout<<"SELECT查询失败!"<<endl;cout<<PQresultErrorMessage(res)<<endl;PQclear(res);return 1;}int i=PQntuples(res);int t=PQnfields(res);for(int s=0;s<i;s++){for(int k=0;k<t;k++){cout<<PQgetvalue(res,s,k);cout<<" ";}cout<<endl;}PQclear(res);/////////////数据库DELETE操作res=PQexec(conn,"DELETE FROM student WHERE id=1001");if(PQresultStatus(res)!=PGRES_COMMAND_OK){cout<<"DELETE语句执行失败!"<<endl;cout<<PQresultErrorMessage(res)<<endl;PQclear(res);return 1;}else{cout<<"DELETE语句执行成功!"<<endl;PQclear(res);}return 0;}


 

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 成功完成一个无数据命令,用于不返回元组信息的执行查询,如INSERTUPDATEDELETE等。

注意: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函数分辨出的。

返回产生PGresultSQL命令的命令状态字符串。

UPDATE的影响行数为0,则应该返回的是”UPDATE 0”字符串。

 

10. 返回被SQL命令影响的行的数量

char* PQcmdTuples(const PGresult* res);

其中resINSERTUPDATEDELETE命令返回涉及的行数,其他命令则返回空字符串。用途和上一条差不多,只是不返回命令名字,仅仅返回影响行数。

 

11. 用于返回访问的出错信息,比如一些操作违反了主键、外键、唯一约束等等。可以讲返回的char*数据打印以分析出错原因。

char* PQresultErrorMessage(PGresult* res);

 

12.返回一个错误字段标识符

char* PQresultErrorField(PGresult* res, intfieldcode);

 

13. 清除结果集PGresult*res的数据,res可以再次用于下一次查询。

void PQclear(PGresult *res);

 

 

 

原创粉丝点击