-
[原创]libpq-PostgreSQL客户端编程接口(二)----libpq中的号令履行函数
添加时间:2013-5-9 点击量:libpq中的号令履行函数有:PQexec,PQexecParams,PQprepare,PQprepared。
PQexec给办事器提交一条号令并且守候成果
定义:PGresult PQexec(PGconn conn,const char command);
PQexec返回一个PGresult指针或者NULL。
PGresult res;
const char command = INSERT INTO mytable (username,weblog) VALUES (ode,http://ode.cnblogs.com);;
res = PQexec(conn,command);号令函数的履行成果可以由PQresultStatus来断定, PQresultErrorMessage用来捕获与PQexec查询接洽关系的错误信息。
1 if(PQresultStatus(res) != PGRES_COMMAND_OK)
2 {
3 // throw exception or show error messages
4 cout << PQresultErrorMessage(res) << endl;
5 }
6 else
7 {
8 //do somthing...
9 }也可以在号令行字符串command中包含多个履行语句,每个语句用分号隔开。PQexec中调用的多个查询,默认是在一个事务中履行的,例如下面这个例子,假设我的command语句有笔误,那么多条语句均不会履行:
command = INSERT INTO mytable (username,weblog) VALUES (ode,http://ode.cnblogs.com);INSERT INTO mytable (username1,weblog) VALUES (odevincent,http://odevincent.blog.51cto.com);;
第二条语句是错误的,第一条语句也不会履行。PQresultmessage返回的错误信息为:
错误: 关系 mytable 的 username1 字段不存在
在PostgreSQL的文档中介绍:“除非在查询字串里有明白的 BEGIN/COMMIT 号令用于把全部字串分隔成多个事务。请重视如许返回的 PGresult 布局只描述字串里履行的最后一条号令的成果。”这里没有进行实验了,实际开辟中若是多个事务,建议定义不合的PQexec来履行。若是是斗劲错杂的营业,可以推敲应用存储过程或其他体式格式。
查询成果信息项目组斗劲简单,看一段示例代码:
PGresult res;
const char strSQL = INSERT INTO mytable (cityname,zipcode) VALUES (SHANGHAI,200200);INSERT INTO mytable (cityname1,zipcode) VALUES (SHANGHAI,200202);;
//res = PQexec(conn,INSERT INTO mytable (cityname,zipcode) VALUES (SHANGHAI,200200););
res = PQexec(conn,strSQL);
if(PQresultStatus(res) != PGRES_COMMAND_OK)
{
cout << command faild! PQresultStatus= << PQresultStatus(res) << endl;
// print error message
cout << PQresultErrorMessage(res) << endl;
}
else
{
cout << commit success.OID is : << PQoidValue(res) << endl;
}
// important !!!
PQclear(res);
PGresult res_getallrows;
res_getallrows = PQexec(conn,SELECT cityname,zipcode FROM mytable;);
if(PQresultStatus(res_getallrows) != PGRES_TUPLES_OK)
{
cout << QUERY faild! PQresultStatus= << PQresultStatus(res_getallrows) << endl;
// print error message
cout << PQresultErrorMessage(res_getallrows) << endl;
}
else
{
// rows count
cout << PQntuples : << PQntuples(res_getallrows) << endl;
// fields count
cout << PQnfields : << PQnfields(res_getallrows) << endl;
int fieldsCount = PQnfields(res_getallrows) ;
for(int fieldIndex = 0;fieldIndex < fieldsCount;++fieldIndex)
{
cout << field << fieldIndex << name is : << PQfname(res_getallrows,fieldIndex) << endl;
// PQfformat
cout << field << fieldIndex << format is : << PQfformat(res_getallrows,fieldIndex) << endl;
// PQfmod
cout << field << fieldIndex << mod is : << PQfmod(res_getallrows,fieldIndex) << endl;
// PQfsize
cout << field << fieldIndex << size is (varchar will return -1.): << PQfsize(res_getallrows,fieldIndex) << endl;
}
cout << cityname fnumber : << PQfnumber(res_getallrows,cityname) << endl;
cout << zipcode fnumber : << PQfnumber(res_getallrows,zipcode) << endl;
/
char PQgetvalue(const PGresult res,
int row_number,
int column_number);
/
int row_number = 0,column_number = 0;
if(!PQgetisnull(res_getallrows,row_number,column_number) )
{
cout << row << row_number << ,column << column_number << value is : << PQgetvalue(res_getallrows,row_number,column_number) << endl;
}
}
// important !!!
PQclear(res_getallrows);到这里,已经可以用libpq完成大项目组的EnterpriseDB(PostgreSQL Plus Advanced Server)数据库日常开辟工作了。
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》