关闭

C++使用oracle的occi库操作oracle数据库

标签: c++oracleocci
3661人阅读 评论(0) 收藏 举报
分类:

// C++使用oracle的occi库操作oracle数据库

//步骤
//1、创建OCCI上下文环境
//2、创建数据库连接
//3、创建Statement对象
//4、执行查询SQL
//5、执行插入SQL
//6、终止Statement对象
//7、断开数据库连接
//8、释放OCCI上下文环境

// 代码示例如下:

#include <string>
using namespace std;
#include "occi.h"
using namespace oracle::occi;

int main(int argc, char *argv[])
{
	char szUserName[40];        // 用户名
	char szPassword[40];        // 密码
	char szConnectString[256];  // 连接字符串

	Environment *pEnv = NULL;   // OCCI上下文环境
	Connection *pConn = NULL;   // 数据库连接
	Statement *pStmt = NULL;    // Statement对象
	std::string strTemp;

	try {
		// 创建OCCI上下文环境
		pEnv = Environment::createEnvironment(
			Environment::Mode(Environment::OBJECT|Environment::THREADED_MUTEXED));
		if (NULL == pEnv) {
			printf("createEnvironment error.\n");
			return -1;
		}
		// 创建数据库连接
		pConn = pEnv->createConnection(szUserName, szPassword, szConnectString);
		if(NULL == pConn) {
			printf("createConnection error.\n");
			return -1;
		}
		// 创建Statement对象
		pStmt = pConn->createStatement();
		if(NULL == pStmt) {
			printf("createStatement error.\n");
			return -1;
		}
		//--------查询---------
		// 查询数据库时间
		ResultSet *pRs = pStmt->executeQuery(
			"SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL");
		while(pRs->next()) {
			strTemp = pRs->getString(1);
			printf("db time:%s.\n", strTemp.c_str());
			// int类型取值用getInt()
			break;
		}
		pStmt->closeResultSet(pRs);
		//--------插入---------
		// 指定DML为自动提交
		pStmt->setAutoCommit(TRUE);
		// 设置执行的SQL语句
		pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')");
		// 执行SQL语句
		nRet = pStmt->executeUpdate();
		if(nRet == 0) {
			printf("executeUpdate insert error.\n");
		}
		//----------------------
		// 终止Statement对象
		pConn->terminateStatement(pStmt);
		// 断开数据库连接
		pEnv->terminateConnection(pConn);
		// 释放OCCI上下文环境
		Environment::terminateEnvironment(pEnv);
	}
	// 捕获数据库操作异常
	catch(SQLException &sqlExcp) {
		printf("SQLException %d:%s.\n", 
			sqlExcp.getErrorCode(), sqlExcp.getMessage().c_str());
		return -1;
	}
	// 捕获其他异常
	catch(exception &ex) {
		printf("other exception %s.\n", ex.what());
		return -1;
	}
	return 0;
}


// 连接池的用法
// 注意连接池在多线程中使用的时候,操作连接池需要加锁
// 使用连接池的时候,数据库服务器要支持才可以使用。
// 启动数据库服务器连接池
// exec dbms_connection_pool.start_pool;

char szUserName[40];            // 用户名
char szPassword[40];            // 密码
char szConnectPoolString[256];  // 连接字符串
int  nMaxConn = 40;             // 最大值
int  nMinConn = 5;              // 初始最小值
int  nIncrConn = 1;             // 每次增长值

// 1、创建OCCI上下文环境
Environment *pEnv = Environment::createEnvironment(
	Environment::Mode(Environment::OBJECT|Environment::THREADED_MUTEXED));

// 2、建立连接池
StatelessConnectionPool *pConnPool = pEnv->createStatelessConnectionPool(
	szUserName, szPassword, szConnectPoolString, nMaxConn, nMinConn, nIncrConn);
pConnPool->setTimeOut(5000);

// 3、从连接池获取连接
Connection *pConn = pConnPool->getConnection(
	szUserName, szPassword, szConnectPoolString);

// 4、释放连接到连接池
pConn->flushCache();
pConnPool->terminateConnection(pConn);

// 5、释放连接池
pEnv->terminateStatelessConnectionPool(m_pConnPool);

// 6、释放OCCI上下文环境
Environment::terminateEnvironment(pEnv);


 // linux下编译、运行
// 1、要在.bash_profile中设置环境变量
//    export ORACLE_BASE=/u01
//    export ORACLE_HOME=$ORACLE_BASE/oracle
//    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
// 2、编译时加上下面的库
//    libocci.so
//    libclntsh.so
//    -locci -lclntsh

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:286431次
    • 积分:2666
    • 等级:
    • 排名:第14109名
    • 原创:52篇
    • 转载:35篇
    • 译文:0篇
    • 评论:26条
    文章分类
    最新评论