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

来源:互联网 发布:淘宝修改我的评价 编辑:程序博客网 时间:2024/05/19 13:20

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

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

// 代码示例如下:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <string>  
  2. using namespace std;  
  3. #include "occi.h"  
  4. using namespace oracle::occi;  
  5.   
  6. int main(int argc, char *argv[])  
  7. {  
  8.     char szUserName[40];        // 用户名  
  9.     char szPassword[40];        // 密码  
  10.     char szConnectString[256];  // 连接字符串  
  11.   
  12.     Environment *pEnv = NULL;   // OCCI上下文环境  
  13.     Connection *pConn = NULL;   // 数据库连接  
  14.     Statement *pStmt = NULL;    // Statement对象  
  15.     std::string strTemp;  
  16.   
  17.     try {  
  18.         // 创建OCCI上下文环境  
  19.         pEnv = Environment::createEnvironment(  
  20.             Environment::Mode(Environment::OBJECT|Environment::THREADED_MUTEXED));  
  21.         if (NULL == pEnv) {  
  22.             printf("createEnvironment error.\n");  
  23.             return -1;  
  24.         }  
  25.         // 创建数据库连接  
  26.         pConn = pEnv->createConnection(szUserName, szPassword, szConnectString);  
  27.         if(NULL == pConn) {  
  28.             printf("createConnection error.\n");  
  29.             return -1;  
  30.         }  
  31.         // 创建Statement对象  
  32.         pStmt = pConn->createStatement();  
  33.         if(NULL == pStmt) {  
  34.             printf("createStatement error.\n");  
  35.             return -1;  
  36.         }  
  37.         //--------查询---------  
  38.         // 查询数据库时间  
  39.         ResultSet *pRs = pStmt->executeQuery(  
  40.             "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL");  
  41.         while(pRs->next()) {  
  42.             strTemp = pRs->getString(1);  
  43.             printf("db time:%s.\n", strTemp.c_str());  
  44.             // int类型取值用getInt()  
  45.             break;  
  46.         }  
  47.         pStmt->closeResultSet(pRs);  
  48.         //--------插入---------  
  49.         // 指定DML为自动提交  
  50.         pStmt->setAutoCommit(TRUE);  
  51.         // 设置执行的SQL语句  
  52.         pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')");  
  53.         // 执行SQL语句  
  54.         nRet = pStmt->executeUpdate();  
  55.         if(nRet == 0) {  
  56.             printf("executeUpdate insert error.\n");  
  57.         }  
  58.         //----------------------  
  59.         // 终止Statement对象  
  60.         pConn->terminateStatement(pStmt);  
  61.         // 断开数据库连接  
  62.         pEnv->terminateConnection(pConn);  
  63.         // 释放OCCI上下文环境  
  64.         Environment::terminateEnvironment(pEnv);  
  65.     }  
  66.     // 捕获数据库操作异常  
  67.     catch(SQLException &sqlExcp) {  
  68.         printf("SQLException %d:%s.\n",   
  69.             sqlExcp.getErrorCode(), sqlExcp.getMessage().c_str());  
  70.         return -1;  
  71.     }  
  72.     // 捕获其他异常  
  73.     catch(exception &ex) {  
  74.         printf("other exception %s.\n", ex.what());  
  75.         return -1;  
  76.     }  
  77.     return 0;  
  78. }  


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

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. char szUserName[40];            // 用户名  
  2. char szPassword[40];            // 密码  
  3. char szConnectPoolString[256];  // 连接字符串  
  4. int  nMaxConn = 40;             // 最大值  
  5. int  nMinConn = 5;              // 初始最小值  
  6. int  nIncrConn = 1;             // 每次增长值  
  7.   
  8. // 1、创建OCCI上下文环境  
  9. Environment *pEnv = Environment::createEnvironment(  
  10.     Environment::Mode(Environment::OBJECT|Environment::THREADED_MUTEXED));  
  11.   
  12. // 2、建立连接池  
  13. StatelessConnectionPool *pConnPool = pEnv->createStatelessConnectionPool(  
  14.     szUserName, szPassword, szConnectPoolString, nMaxConn, nMinConn, nIncrConn);  
  15. pConnPool->setTimeOut(5000);  
  16.   
  17. // 3、从连接池获取连接  
  18. Connection *pConn = pConnPool->getConnection(  
  19.     szUserName, szPassword, szConnectPoolString);  
  20.   
  21. // 4、释放连接到连接池  
  22. pConn->flushCache();  
  23. pConnPool->terminateConnection(pConn);  
  24.   
  25. // 5、释放连接池  
  26. pEnv->terminateStatelessConnectionPool(m_pConnPool);  
  27.   
  28. // 6、释放OCCI上下文环境  
  29. 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
原创粉丝点击