C++ postagesql 连接

/*
 * PgConnector.cpp
 *
 *  Created on: 2012-9-12
 *      Author: Gabriel
 */

#include "db/PgConnector.h"
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

namespace gaby {

	PgConnector::PgConnector() {
	}

	PgConnector::~PgConnector() {
	}

} /* namespace gaby */

int main(	int argc,
			char **argv) {
	const char *conninfo = "dbname=mvmdb";
	PGconn *conn;
	PGresult *res;
	int nFields;
	int i, j;

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

	/* 检查后端连接成功建立 */
	if (PQstatus(conn) != CONNECTION_OK) {
		fprintf(stderr, "Connection to database failed: %s",
		PQerrorMessage(conn));
		PQfinish(conn);
		return -1;
	}

		/*
		 * 我们的测试实例涉及游标的使用,这个时候我们必须使用事务块
		 * 我们可以把全部事情放在一个  "select * from pg_database"
		 * PQexec() 里,不过那样太简单了,不是个好例子。
		 */

		/* 开始一个事务块 */
	res = PQexec(conn, "BEGIN");
	if (PQresultStatus(res) != PGRES_COMMAND_OK) {
		fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
		PQclear(res);
		PQfinish(conn);
		return -1;
	}

		/*
		 * 应该在结果不需要的时候 PQclear PGresult,以避免内存泄漏
		 */
	PQclear(res);
	//fprintf(stderr, "测试输出错误: %s", PQerrorMessage(conn));
	/*
	 * 从系统表 pg_database 里抓取数据
	 */
	res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
	if (PQresultStatus(res) != PGRES_COMMAND_OK) {
		fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
		PQclear(res);
		PQfinish(conn);
		return -1;
	}
	PQclear(res);

	res = PQexec(conn, "FETCH ALL in myportal");
	if (PQresultStatus(res) != PGRES_TUPLES_OK) {
		fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
		PQclear(res);
		PQfinish(conn);
		return -1;
	}

		/* 首先,打印属性名称 */
	nFields = PQnfields(res);
	for (i = 0; i < nFields; i++)
		printf("%-15s", PQfname(res, i));
	printf("\n\n");

	/* 然后打印行 */
	for (i = 0; i < PQntuples(res); i++) {
		for (j = 0; j < nFields; j++)
			printf("%-15s", PQgetvalue(res, i, j));
		printf("\n");
	}

	PQclear(res);

	/* 关闭游标 ... 我们不用检查错误 ... */
	res = PQexec(conn, "CLOSE myportal");
	PQclear(res);

	/* 结束事务 */
	res = PQexec(conn, "END");
	PQclear(res);

	/* 关闭数据库连接并清理 */
	PQfinish(conn);

	return 0;
}

经过测试,可以用

工程设置:

include :   .....\postgresql-9.1.1-1-windows-binaries\include

lib:            -lpg

猜你喜欢

转载自gabriel1017.iteye.com/blog/1678204
今日推荐