您的位置:首页 > 运维架构 > Linux

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

2012-12-07 11:20 471 查看
转载请注明本文出处,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 成功完成一个无数据命令,用于不返回元组信息的执行查询,如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);

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C LINUX PostgreSQL 语言