|
最近在学习oracle 的c++的编程接口OCCI,自己做了一个简单的包装类,源码贴出来供大家参考。此程序并没有经过严格的测试,只是兴趣所至,大家如果要商用的话,还需进一步完善,代码在vs2005和AIX的xlC中测试通过。 注意:如果需要在vs2005中链接,需要到oracle网站上下载最新的vs2005的occi库文件。
以下是引用片段: TOcci.h #ifndef_OCCIDATABASE_H_ #define_OCCIDATABASE_H_ #include #include #include usingnamespaceoracle::occi; usingnamespacestd; namespacehappyever { classTOcciDatabase { public: staticTOcciDatabase*getInstance(stringusr,stringpasswd,stringdb); intgetConnectCount(){return_Instance->count;}; Connection*getConnect(){count++;return_Instance->conn;}; ~TOcciDatabase(); protected: TOcciDatabase(){}; TOcciDatabase(stringusr,stringpasswd,stringdb); private: staticTOcciDatabase*_Instance; staticintcount; Environment*env; Connection*conn; }; intTOcciDatabase::count=0; TOcciDatabase*TOcciDatabase::_Instance=0; TOcciDatabase::TOcciDatabase(stringusr,stringpasswd,stringdb) { try { env=Environment::createEnvironment(Environment::DEFAULT); conn=env->createConnection(usr,passwd,db); } catch(SQLExceptionex) { cout<<"ExceptionthrownforgetConnect"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; TOcciDatabase::~TOcciDatabase() { try { env->terminateConnection(conn); Environment::terminateEnvironment(env); } catch(SQLExceptionex) { cout<<"ExceptionthrownforgetConnect"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; TOcciDatabase*TOcciDatabase::getInstance(stringusr,stringpasswd,stringdb) { if(_Instance==0) { _Instance=newTOcciDatabase(usr,passwd,db); } return_Instance; }; classTOcciQuery { private: Connection*conn; Statement*stmt; boolisAutoCommit; TOcciQuery(){}; public: TOcciQuery(Connection*connect){conn=connect;}; voidbeginTrans(); voidcommit(); voidroolback(); booleangetAutoCommit(); ResultSet*executeQuery(stringsql); voidexecuteUpdate(stringsql); voidclose(){if(stmt!=NULL)conn->terminateStatement(stmt);}; voidclose(ResultSet*rs); }; voidTOcciQuery::close(ResultSet*rs) { if(rs!=NULL) stmt->closeResultSet(rs); if(stmt!=NULL) conn->terminateStatement(stmt); }; voidTOcciQuery::beginTrans() { try { isAutoCommit=stmt->getAutoCommit(); stmt->setAutoCommit(false); } catch(SQLExceptionex) { cout<<"ExceptionthrownforbeginTrans"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; voidTOcciQuery::commit() { try { conn->commit(); stmt->setAutoCommit(isAutoCommit); } catch(SQLExceptionex) { cout<<"Exceptionthrownforcommit"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; voidTOcciQuery::roolback() { try { conn->rollback(); stmt->setAutoCommit(isAutoCommit); } catch(SQLExceptionex) { cout<<"Exceptionthrownforroolback"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; booleanTOcciQuery::getAutoCommit() { booleanresult=false; try { result=stmt->getAutoCommit(); } catch(SQLExceptionex) { cout<<"ExceptionthrownforgetAutoCommit"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } returnresult; }; ResultSet*TOcciQuery::executeQuery(stringsql) { ResultSet*rs=NULL; try { stmt=conn->createStatement(); rs=stmt->executeQuery(sql); } catch(SQLExceptionex) { cout<<"ExceptionthrownforexecuteQuery"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } returnrs; }; voidTOcciQuery::executeUpdate(stringsql) { try { stmt=conn->createStatement(); stmt->executeUpdate(sql); } catch(SQLExceptionex) { cout<<"ExceptionthrownforexecuteUpdate"< cout<<"Errornumber:"<<ex.getErrorCode()<<endl; cout< throwex; } }; } #endif/*_OCCIDATABASE_H_*/ 测试程序main.cpp源码如下: //occi.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" #include"TOcci.h" int_tmain(intargc,_TCHAR*argv[]) { usingnamespacehappyever; TOcciQuery*query=new TOcciQuery(TOcciDatabase::getInstance("cal","cal","v2b76")->getConnect()); stringstrSQL="selectcount(*)fromserv_value_total"; ResultSet*rs=query->executeQuery(strSQL); while(rs->next()) { std::cout<<"count="<getInt(1)< } query->close(rs); delete(query); return1; } |
阅读关于 oracle OCCI 包装类 的全部文章 |