Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104673905
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-06 17:43:46

    来源:中国IT实验室   

自己做了一个简单的包装类,源码贴出来供大家参考。此程序并没有经过严格的测试,还需进一步完善,代码在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 = "close(rs); 
  delete(query); 
  return 1; 
  }
阅读(205) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~