熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

oracleOCCI的一個簡單的包裝類的實現

2022-06-13   來源: Oracle 

  最近在學習oracle 的c++的編程接口OCCI自己做了一個簡單的包裝類源碼貼出來供大家參考此程序並沒有經過嚴格的測試只是興趣所至大家如果要商用的話還需進一步完善代碼在vs和AIX的xlC中測試通過

  注意如果需要在vs中鏈接需要到oracle網站上下載最新的vs的occi庫文件


以下是引用片段
  TOccih
  #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 = ;
  TOcciDatabase* TOcciDatabase::_Instance = ;
  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: << exgetErrorCode() << endl;
  cout< 
  throw ex;
  }
  };
  TOcciDatabase::~TOcciDatabase()
  {
  try
  {
  env>terminateConnection (conn);
  Environment::terminateEnvironment (env);
  }
  catch(SQLException ex)
  {
  cout<<Exception thrown for getConnect
  cout<<Error number: << exgetErrorCode() << endl;
  cout< 
  throw ex;
  }
  };
  TOcciDatabase* TOcciDatabase::getInstance(string usr string passwd string db)
  {
  if(_Instance == )
  {
  _Instance = new TOcciDatabase(usrpasswddb);
  }
  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: << exgetErrorCode() << endl;
  cout< 
  throw ex;
  }
  };
  void TOcciQuery::commit()
  {
  try
  {
  conn>commit();
  stmt>setAutoCommit(isAutoCommit);
  }
  catch(SQLException ex)
  {
  cout<<Exception thrown for commit
  cout<<Error number: << exgetErrorCode() << endl;
  cout< 
  throw ex;
  }
  };
  void TOcciQuery::roolback()
  {
  try
  {
  conn>rollback();
  stmt>setAutoCommit(isAutoCommit);
  }
  catch(SQLException ex)
  {
  cout<<Exception thrown for roolback
  cout<<Error number: << exgetErrorCode() << 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: << exgetErrorCode() << 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: << exgetErrorCode() << 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: << exgetErrorCode() << endl;
  cout< 
  throw ex;
  }
  };
  }
  #endif /*_OCCIDATABASE_H_*/
  測試程序maincpp源碼如下
  // occicpp : 定義控制台應用程序的入口點
  //
  #include stdafxh
  #include TOccih
  int _tmain(int argc _TCHAR* argv[])
  {
  using namespace happyever;
  TOcciQuery *query = new
  TOcciQuery(TOcciDatabase::getInstance(calcalvb)>getConnect());
  string strSQL = select count(*) from serv_value_total;
  ResultSet* rs = query>executeQuery(strSQL);
  while(rs>next())
  {
  std::cout<<count = <getInt()< 
  }
  query>close(rs);
  delete(query);
  return ;
  }



From:http://tw.wingwit.com/Article/program/Oracle/201311/18229.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.