| 网站首页 | JAVA文章 | AppServers | Web开发 | 应用开发 | 资源下载 | 论坛
    想学好编程,外语很重要,最新的编程技术还是在国外  [enadd  2006年12月25日]        
设为首页 加入收藏 联系站长
您现在的位置: 编程笔记网 >> 数据库 >> oracle >> 经验技巧 >> 文章正文
oracle OCCI 的一个简单的包装类的实现            【字体:
oracle OCCI 的一个简单的包装类的实现
作者:-    文章来源:-    点击数:    更新时间:2007-3-8

最近在学习oracle 的c++的编程接口OCCI,自己做了一个简单的包装类,源码贴出来供大家参考。此程序并没有经过严格的测试,只是兴趣所至,大家如果要商用的话,还需进一步完善。


最近在学习oracle 的c++的编程接口OCCI,自己做了一个简单的包装类,源码贴出来供大家参考。此程序并没有经过严格的测试,只是兴趣所至,大家如果要商用的话,还需进一步完善,代码在vs2005和AIX的xlC中测试通过。

注意:如果需要在vs2005中链接,需要到oracle网站上下载最新的vs2005的occi库文件。

TOcci.h

#ifndef _OCCIDATABASE_H_
#define _OCCIDATABASE_H_
#include <occi.h>
#include <string>
#include <iostream>

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"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      throw ex;
    }
  };

  TOcciDatabase::~TOcciDatabase()
  {
    try
    {
      env->terminateConnection (conn);
      Environment::terminateEnvironment (env);
    }
    catch(SQLException ex)
    {
      cout<<"Exception thrown for getConnect"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      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"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      throw ex;
    }
  };

  void TOcciQuery::commit()
  {
    try
    {
      conn->commit();
      stmt->setAutoCommit(isAutoCommit);
    }
    catch(SQLException ex)
    {
      cout<<"Exception thrown for commit"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      throw ex;
    }
  };

  void TOcciQuery::roolback()
  {
    try
    {
      conn->rollback();
      stmt->setAutoCommit(isAutoCommit);
    }
    catch(SQLException ex)
    {
      cout<<"Exception thrown for roolback"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      throw ex;
    }
  };

  boolean TOcciQuery::getAutoCommit()
  {
    boolean result = false;
    try
    {
      result = stmt->getAutoCommit();
    }
    catch(SQLException ex)
    {
      cout<<"Exception thrown for getAutoCommit"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      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"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      throw ex;
    }
    return rs;
  };

  void TOcciQuery::executeUpdate(string sql)
  {
    try
    {
      stmt = conn->createStatement();
      stmt->executeUpdate(sql);
    }
    catch (SQLException ex)
    {
      cout<<"Exception thrown for executeUpdate"<<endl;
      cout<<"Error number: "<<  ex.getErrorCode() << endl;
      cout<<ex.getMessage() << endl;
      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 = "<<rs->getInt(1)<<std::endl;
  }

  query->close(rs);

  delete(query);

  return 1;
}

 


 

文章录入:fengyun    责任编辑:fengyun 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • oracle 内存数据库 TimesTen…

  • Oracle常用函数

  • Oracle中null的使用详解

  • Oracle函数to_char转化数字型…

  • 在Oracle中获取磁盘空间的使…

  • Oracle的左连接和右连接

  • 使用oracle9i数据库的注意事…

  • oracle里面使用临时表解决表…

  • oracle里的常用命令

  • 关于修改表字段数据类型的问…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 |