Linux下PostgresQL数据库C语言接口:libpq (二)数据库访问
2012-12-07 11:20
471 查看
转载请注明本文出处,LeonidasFlames的blog ,链接:Linux下PostgreSQL数据库C语言接口:libpq (二)
二、libpq库下C语言程序对PostgreSQL的访问
首先看一个程序示例:
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);
二、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);
相关文章推荐
- Linux下PostgresQL数据库C语言接口:libpq (一)数据库连接
- Linux下PostgresQL数据库C语言接口:libpq (三)控制事务
- C语言中使用libpq访问Postgresql数据库
- 访问PostgreSQL:C语言接口
- 任意语言访问PostgreSQL:C语言接口
- postgresql libpq c接口 操作数据库例子
- 任意语言访问PostgreSQL:C语言接口
- C语言访问INFORMIX数据库 — 接口实现
- [原创]libpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数
- VS2010中c++程序调用PostgreSQL数据库C接口libpq.lib的项目Properties设置
- libpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数
- linux 下c语言访问mysq
- Linux下免费数据库PostgreSQL开发入门
- Linux下调试PostgreSQL数据库
- Linux全攻略--PostgreSQL数据库配置与管理
- linux 访问 MS sql Server 数据库 sql Server2008 R2
- .NET 访问PostgreSQL数据库
- .NET 访问PostgreSQL数据库
- Linux下免费数据库PostgreSQL开发入门
- Postgres访问其他PostgresQL数据库的功能DBLINK