zoukankan      html  css  js  c++  java
  • vc 用ado访问Oracle数据库的代码示例

    先决条件

    1.客户端一定要安装 Oracle的oledb的驱动。可到以下网址下载(10.版本的大概190M)

    http://otn.oracle.com/software/tech/windows/ole_db/content.html

    2.要使用Net Configuration Assistant配置好侦听及相关环境

    代码

    首先,在 stdafx.h 中加入以下代码,导入ado库

    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

    其次,要确保有 ::CoInitialize(NULL)的调用,以初始化COM.

     

    //类定义

    class CDBOp 
    {
    public:
     bool ReConnect();

     bool CloseConnect();
     bool OpenConnect(int dbType,  CString hostName, CString dBName, CString userName, CString password);

     bool GetItemData(CString itemID, float &price, CString &descript);  //取存储过程数据,这里只是举例说明
     CString GetErrorMsg();
     CDBOp();
     virtual ~CDBOp();

    private:
     _ConnectionPtr m_pConnection;  //连接对象
     _RecordsetPtr m_pRecordset;     //记录集对象

     bool   m_bConnectSuccess;     //连接是否成功
     CString   m_strConnString;      //数据库连接字符串 
     CString   m_strErrMsg;           //保存错误信息
    };

    //类实现

    CDBOp::CDBOp():m_bConnectSuccess(false)
    {
     ::CoInitialize(NULL);

     m_pConnection.CreateInstance("ADODB.Connection");
     m_pConnection->ConnectionTimeout=30;
     m_pRecordset.CreateInstance("ADODB.Recordset");
    }

    CDBOp::~CDBOp()
    {
     //::CoUninitialize();
     CloseConnect();
    }

    //打开连接(数据库类型,主机名,数据库名,登陆名,密码)
    //数据库类型: 0 为Sql server, 1为 Oracle
    bool CDBOp::OpenConnect(int dBType, 
            CString hostName,
            CString dBName,
            CString userName,
            CString password)       
    {
     CString strConn;
     
     if (dBType =0)  //Sql server
     {
      strConn = "Provider=SQLOLEDB.1";
      strConn+= ";User ID=";
      strConn+= userName;
      strConn+= ";Password=";
      strConn+= password;
      strConn+= ";Initial Catalog=";
      strConn+= dBName;
      strConn+= ";Data Source=";
      strConn+= hostName;
     }
     else if (dBType =1) //Oracle
     {
     //MSDAORA or OraOLEDB.Oracle.1
      strConn = "Provider=OraOLEDB.Oracle.1";
      strConn+= ";Persist Security Info=true";
      strConn+= ";User ID=";
      strConn+= userName;
      strConn+= ";Password=";
      strConn+= password;

      strConn+= ";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)";
      strConn+= "(HOST=";
      strConn+= hostName;
      strConn+= ")(PORT=1521))(CONNECT_DATA=";
      strConn+= "(SERVICE_NAME=";
      strConn+= dBName;
      strConn+= ")))";
     }
     
     
     if (strConn.IsEmpty()) 
     {
      m_strErrMsg="The connect string is null.";
      return false;
     }

     CloseConnect();

     m_strConnString =strConn; 
       
     return ReConnect();
    }

    //再次连接
    bool CDBOp::ReConnect()
    {
     m_strErrMsg=_T("");
     m_bConnectSuccess= false;

     HRESULT hr;
     try
     {
      hr = m_pConnection->Open(_bstr_t(m_strConnString), "", "", adModeUnknown);
      if (SUCCEEDED(hr))
       m_bConnectSuccess=true;  
     }
     catch(_com_error e)
     {  
      m_strErrMsg.Format("Connect database failure!\r\n\r\n message error:%s\r\n\r\n The connect string:%s",e.ErrorMessage(),m_strConnString); 
     }

     return m_bConnectSuccess;
    }

    //关闭链接
    bool CDBOp::CloseConnect()
    {
     if (m_bConnectSuccess)
     {
      if (m_pConnection->State==1)
       m_pConnection->Close(); 

      m_bConnectSuccess =false;
     }
     return true;
    }

    //取得错误信息
    CString CDBOp::GetErrorMsg()
    {
     return m_strErrMsg;
    }

    bool CDBOp::GetItemData(CString itemID, float &price, CString &descript)

    {
     _CommandPtr   pCommand = NULL;
     pCommand.CreateInstance("ADODB.Command");
        #ifdef   _DEBUG  
        if   (pCommand   ==   NULL)  
        {  
          AfxMessageBox("Command Created fail! Please confirm whether initialize COM.");  
        }  
        #endif  
        ASSERT(pCommand   !=   NULL);  

        try  
        {  
      if (m_bConnectSuccess==false)
      {
       if (ReConnect()==false)
        return false;
      }

      //输入参数   itemID    
      _ParameterPtr   pParamItemID;   
      pParamItemID.CreateInstance("ADODB.Parameter");   
      pParamItemID->Name="ItemID";   //所用存储过程参数名称   
      pParamItemID->Type=adChar;    //参数类型   
      pParamItemID->Size=10;     //参数大小   
      pParamItemID->Direction=adParamInput;  //表明是输入参数   
      pParamItemID->Value=_variant_t(itemID);  
      pCommand->Parameters->Append(pParamItemID);    
      
      
      //输出参数   price    
      _ParameterPtr   pParamPrice;       
      pParamPrice.CreateInstance("ADODB.Parameter");   
      pParamPrice->Name="Price";    //参数名称   
      pParamPrice->Type=adNumeric;    //参数类型   
      pParamPrice->Size=9;      //参数大小
      pParamPrice->Precision =9;
      pParamPrice->NumericScale =2;  

      pParamPrice->Direction=adParamOutput;  //声明是输出参数   
      pCommand->Parameters->Append(pParamPrice);  

      //输出参数   Descript    
      _ParameterPtr   pParamDescript;      
      pParamDescript.CreateInstance("ADODB.Parameter");  
      pParamDescript->Name="Descript";   //参数名称  
      pParamDescript->Type=adVarChar;    //参数类型  
      pParamDescript->Size=160;     //参数大小
      pParamDescript->Direction=adParamOutput; //声明是输出参数  
      pCommand->Parameters->Append(pParamDescript);  

      //执行存储过程  
      pCommand->ActiveConnection=m_pConnection;  
      pCommand->CommandText="spItemInfo";   //存储过程名称  
      pCommand->CommandType=adCmdStoredProc;  //表示为存储过程adCmdStoredProc  
      pCommand->Execute(NULL,   NULL,   adCmdStoredProc);   
      
     
      price=(float)(pParamPrice->Value);
      descript = (char*)_bstr_t(pParamDescript->Value);  

      return true;
     }
        catch(_com_error   e)  
        {        
          m_strErrMsg.Format(_T("Error:GetItemData. Reason:%s\n file: %s; line: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);      
       return false;
        }  
     
    }


     

  • 相关阅读:
    Linux的中文输入法Fcitx-国货精品
    Linux内核编译与安装[转]
    Linux内核编译与安装[转]
    修改镜像地址加快Ubuntu更新速度
    修改镜像地址加快Ubuntu更新速度
    OSX操作技巧:快速锁定系统(类似Windows+L)
    NDK编程入门笔记[转]
    NDK编程入门笔记[转]
    内置函数图形分类
    函数的定义
  • 原文地址:https://www.cnblogs.com/finema/p/1273478.html
Copyright © 2011-2022 走看看