} } }

    [原创]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) ;
    forint 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)数据库日常开辟工作了。

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: