Oracle OCCI的一個簡單的包裝類的實現
2024-08-29 13:33:51
供稿:網友
 
             注重:假如需要在vs2005中鏈接,需要到Oracle網站上下載最新的vs2005的occi庫文件。TOcci.h 
#ifndef _OCCIDATABASE_H_ 
#define _OCCIDATABASE_H_ 
#include  
#include  
#include  
using namespace oracle::occi; 
using namespace std; 
namespace happyever 
{ 
class TOcciDatabase 
{ 
public: 
static TOcciDatabase* getInstance(string usr, string passwd, string db); 
int getConnectCount(){ return _Instance->count; }; 
Connection* getConnect(){ count++;return _Instance->conn; }; 
~TOcciDatabase(); 
PRotected: 
TOcciDatabase(){}; 
TOcciDatabase(string usr, string passwd, string db); 
private: 
static TOcciDatabase* _Instance; 
static int count; 
Environment *env; 
Connection *conn; 
}; 
int TOcciDatabase::count = 0; 
TOcciDatabase* TOcciDatabase::_Instance = 0; 
TOcciDatabase::TOcciDatabase(string usr, string passwd, string db) 
{ 
try 
{ 
env = Environment::createEnvironment (Environment::DEFAULT); 
conn = env->createConnection (usr, passwd, db); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for getConnect"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
TOcciDatabase::~TOcciDatabase() 
{ 
try 
{ 
env->terminateConnection (conn); 
Environment::terminateEnvironment (env); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for getConnect"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
TOcciDatabase* TOcciDatabase::getInstance(string usr, string passwd, string db) 
{ 
if(_Instance == 0) 
{ 
_Instance = new TOcciDatabase(usr,passwd,db); 
} 
return _Instance; 
}; 
class TOcciQuery 
{ 
private: 
Connection *conn; 
Statement *stmt; 
bool isAutoCommit; 
TOcciQuery(){}; 
public : 
TOcciQuery(Connection *connect){ conn = connect; }; 
void beginTrans(); 
void commit(); 
void roolback(); 
boolean getAutoCommit(); 
ResultSet* executeQuery(string sql) ; 
void executeUpdate(string sql) ; 
void close() { if(stmt != NULL) conn->terminateStatement (stmt); }; 
void close(ResultSet* rs); 
}; 
void TOcciQuery::close(ResultSet* rs) 
{ 
if(rs != NULL) 
stmt->closeResultSet (rs); 
if(stmt != NULL) 
conn->terminateStatement (stmt); 
}; 
void TOcciQuery::beginTrans() 
{ 
try 
{ 
isAutoCommit = stmt->getAutoCommit(); 
stmt->setAutoCommit(false); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for beginTrans"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
void TOcciQuery::commit() 
{ 
try 
{ 
conn->commit(); 
stmt->setAutoCommit(isAutoCommit); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for commit"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
void TOcciQuery::roolback() 
{ 
try 
{ 
conn->rollback(); 
stmt->setAutoCommit(isAutoCommit); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for roolback"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
boolean TOcciQuery::getAutoCommit() 
{ 
boolean result = false; 
try 
{ 
result = stmt->getAutoCommit(); 
} 
catch(SQLException ex) 
{ 
cout<<"Exception thrown for getAutoCommit"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
return result; 
}; 
ResultSet* TOcciQuery::executeQuery(string sql) 
{ 
ResultSet*rs = NULL; 
try 
{ 
stmt = conn->createStatement(); 
rs = stmt->executeQuery(sql); 
} 
catch (SQLException ex) 
{ 
cout<<"Exception thrown for executeQuery"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
return rs; 
}; 
void TOcciQuery::executeUpdate(string sql) 
{ 
try 
{ 
stmt = conn->createStatement(); 
stmt->executeUpdate(sql); 
} 
catch (SQLException ex) 
{ 
cout<<"Exception thrown for executeUpdate"<  
cout<<"Error number: "<< ex.getErrorCode() << endl; 
cout<  
throw ex; 
} 
}; 
} 
#endif /*_OCCIDATABASE_H_*/ 
測試程序main.cpp源碼如下: 
// occi.cpp : 定義控制臺應用程序的入口點。
                          
// 
#include "stdafx.h" 
#include "TOcci.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
using namespace happyever; 
TOcciQuery *query = new 
TOcciQuery(TOcciDatabase::getInstance("cal","cal","v2b76")->getConnect()); 
string strSQL = "select count(*) from serv_value_total"; 
ResultSet* rs = query->executeQuery(strSQL); 
while(rs->next()) 
{ 
std::cout<<"count = "<getInt(1)<  
} 
query->close(rs); 
delete(query); 
return 1; 
}