libpq中调用prepared statement:

代码如下:

[root@lex tst]# cat testlibpq.c
/*
 * testlibpq.c
 *  Test the C version of LIBPQ, the POSTGRES frontend library.
 */
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
 PQfinish(conn);
 exit(EXIT_SUCCESS);
}

int
main()
{
 int   nFields;
 int   i,
       j;

#ifdef DEBUG
 FILE    *debug;
#endif  /* DEBUG */

 PGconn    *conn;
 PGresult   *res;

 const char *conninfo="postgresql://postgres:postgres@localhost:5432/postgres";

 /* make a connection to the database */
 conn = PQconnectdb(conninfo);

 /* check to see that the backend connection was successfully made */
 if (PQstatus(conn) == CONNECTION_BAD)
 {
  fprintf(stderr, "Connection to database failed.\n");
  fprintf(stderr, "%s", PQerrorMessage(conn));
  exit_nicely(conn);
 }

#ifdef DEBUG
 debug = fopen("/tmp/trace.out", "w");
 PQtrace(conn, debug);
#endif  /* DEBUG */

 /* start a transaction block */
 res = PQexec(conn, "BEGIN");
 if (PQresultStatus(res) != PGRES_COMMAND_OK)
 {
  fprintf(stderr, "BEGIN command failed\n");
  PQclear(res);
  exit_nicely(conn);
 }

 PQclear(res);

 ////////////////////////////////////////////////////////////////////////////////////
 const char *stmt_name = "test_stmt";
 const char *stmt = "select * from customers where cust_id=$1";

 Oid param_types[1];
 param_types[0] = 0; ///let db to judge it.

 res = PQprepare(conn, stmt_name, stmt,1,param_types);
 if (PQresultStatus(res) != PGRES_COMMAND_OK)
 {
  fprintf(stderr, "PQprepare failed\n");
  PQclear(res);
  exit_nicely(conn);
 }

 PQclear(res);

 const char* custid = "3";
 const char* param_values[1];
 param_values[0] =custid;

 int param_lengths[1];
 param_lengths[0] = 1;

 int param_formats[1];
 param_formats[0] = 0;
 
 res = PQexecPrepared(conn, stmt_name, 1, param_values, param_lengths,
                        param_formats, 0);

 if (PQresultStatus(res) != PGRES_TUPLES_OK)
 {
  fprintf(stderr, "PQexecPrepared statement didn't return tuples properly\n");
  PQclear(res);
  exit_nicely(conn);
 }

 ///////////////////////////////////////////////////////////////////////////////////
 
 /* first, print out the attribute names */
 nFields = PQnfields(res);
 for (i = 0; i < nFields; i++)
  printf("%-15s", PQfname(res, i));

 printf("\n\n");

 /* next, print out the instances */
 for (i = 0; i < PQntuples(res); i++)
 {
  for (j = 0; j < nFields; j++)
   printf("%-15s", PQgetvalue(res, i, j));
  printf("\n");
 }

 PQclear(res);

 /* end the transaction */
 res = PQexec(conn, "END");
 PQclear(res);

 /* close the connection to the database and cleanup */
 PQfinish(conn);

#ifdef DEBUG
 fclose(debug);
#endif  /* DEBUG */

 return 0;
}
[root@lex tst]# 

编译和运行:

[root@lex tst]# gcc -c -I/usr/local/pgsql/include testlibpq.c
[root@lex tst]# gcc -o testlibpq testlibpq.o -L/usr/local/pgsql/lib -lpq
[root@lex tst]# ./testlibpq
cust_id        cust_name      

3              Taylor         
[root@lex tst]# 

 

posted @ 2013-06-17 16:11  健哥的数据花园  阅读(1118)  评论(0编辑  收藏  举报