萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> oracle教程 >> Oracle OCCI的一個簡單的包裝類的實現

Oracle OCCI的一個簡單的包裝類的實現

自己做了一個簡單的包裝類,源碼貼出來供大家參考。此程序並沒有經過嚴格的測試,還需進一步完善,代碼在vs2005和AIX的XlC中測試通過。

注意:如果需要在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; 
        }
copyright © 萬盛學電腦網 all rights reserved