ado连接数据库(sqlserver, oracle)

  1. 类定义

  2. //AdoCallDB.h 定义 DLL类的头文件 
    // 
    #include <iostream>
    using namespace std; 
    #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("EOF","adoEOF")  
    //sqlserver 连接串 "Provider=SQLOLEDB;Server=.\\MSSQLSVR;Database=xxx;uid=xxx;pwd=xxx" 
    // oracle 连接串 "Provider=OraOLEDB.Oracle;Data Source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST =127.0.0.1)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME =xxx)));User Id=xxx;Password=xxx;"
     
    class __declspec(dllexport)ADOCallDB//dll导出
    {
    public:
      char conStr [500] ;
    public:
     ADOCallDB(char *str); 
     ADOCallDB(); 
     ~ADOCallDB();
     //初始化-连接数据库
     bool InitADOCom();
     //执行查询,返回结果集
     bool GetRecordSet(const char * bstrSQL, _RecordsetPtr &m_pRecordset);
     
     bool GetResult(const char * bstrSQL, const char *ValueNmae,char **p);
     bool GetResult(const char* bstrSQL,const char * ValueName, char *p);
     //执行sql语句,更新数据库
     bool Execute(const char * bstrSQL); 
     
    private:
      _ConnectionPtr m_pConnection;
    
    };
  3. 函数实现

  4. // AdoCallDB.cpp : 定义 DLL 应用程序的导出函数。
    //
    #include "stdafx.h"
    #include "AdoCallDB.h"
    #include <iostream>
    using namespace std;   
    ADOCallDB::ADOCallDB()
    {
    }
    ADOCallDB::~ADOCallDB()
    {
     if(m_pConnection != NULL )
     {
      m_pConnection->Close();
      m_pConnection=NULL;
     }
     //释放环境
     ::CoUninitialize();//关闭ole/com库,释放资源
    }
    ADOCallDB::ADOCallDB(char *str)
    {
     strcpy_s(conStr, 500, str);
    }
    
    bool ADOCallDB::InitADOCom()
    {
     ::CoInitialize(NULL);//   初始化OLE/COM库环境   ,为访问ADO接口做准备
     
     
     HRESULT hr;
     try
     {
      hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
      m_pConnection ->ConnectionTimeout = 0;
      
      hr = m_pConnection->Open( conStr,"", "", adModeUnknown);
      //m_pConnection ->ConnectionTimeout = 600;
      
      if(!SUCCEEDED(hr))
      {
       cout << "连接数据库fail" << endl;
       return false;
      }
     }
     catch(_com_error e)///捕捉异常
     {  
      cout<<"连接数据库失败!\r\n错误信息:"<<e.Description()<<endl;
      m_pConnection =NULL;  
      
      return false;
     }
     return true;
    }
    bool ADOCallDB::GetRecordSet(const char * bstrSQL, _RecordsetPtr &m_pRecordset)
    {
     try
     {
      //连接数据库,如果connection对象为空,则重新连接数据库
      if(m_pConnection==NULL)
       if(!InitADOCom())
       {
        m_pConnection = NULL;
        return false;
       }
      //创建记录集对象
      
      m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
      
      
      
     }
     catch(_com_error e)
     {
      
      m_pConnection->Close();
      m_pConnection=NULL;
      cout<<e.Description()<<endl;
      return ;
     }
     //返回记录集
     return true;
    }
    bool ADOCallDB::GetResult(const char* bstrSQL,const char * ValueName, char **p)
    {
     _RecordsetPtr m_pRecordset;
     try
     {
      //连接数据库,如果connection对象为空,则重新连接数据库
      if(m_pConnection == NULL)
      {
       //GWAM001_FUNC01("NULL");
       if(!InitADOCom())
       {
        m_pConnection = NULL;
        return false;
       }
      }
      
      
      //创建记录集对象
      
      m_pRecordset.CreateInstance(_uuidof(Recordset));
      m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
      //GWAM001_FUNC01(bstrSQL);/**/
      ::SysFreeString((_bstr_t)bstrSQL);
      if(m_pRecordset -> adoEOF)
      {
       *p = NULL;
       m_pRecordset ->Close();
       //m_pRecordset ->Release();
       return true;
      }
      m_pRecordset -> MoveFirst();
      if(!m_pRecordset -> adoEOF) 
      {
       //_bstr_t eValue = (char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
       _variant_t eValue;
       eValue = m_pRecordset ->GetCollect(ValueName);
       
       if(eValue.vt == VT_NULL)  
       {
        *p =  NULL;
        //eValue.SetString("NULL");
        m_pRecordset ->Close();
        //m_pRecordset ->Release();
        return true;
       }
       int len = strlen((char*)(_bstr_t)eValue)+1;
       *p = (char*)malloc(len);
       strcpy_s(*p, len ,(char*)(_bstr_t)eValue);
      }
      m_pRecordset ->Close();
      //m_pRecordset ->Release();
     }
     catch(_com_error e)
     {
      m_pRecordset ->Close();  
      cout<<e.Description()<<endl;  
      m_pConnection->Close();
      m_pConnection=NULL;
      return false;
     }
     
     return true;
    }
    bool ADOCallDB::GetResult(const char* bstrSQL,const char * ValueName, char *p)
    {
     _RecordsetPtr m_pRecordset;
     try
     {
      //连接数据库,如果connection对象为空,则重新连接数据库
      if(m_pConnection == NULL)
      {
       //GWAM001_FUNC01("NULL");
       if(!InitADOCom())
       {
        m_pConnection = NULL;
        return false;
       }
      }
      
      
      //创建记录集对象
      m_pRecordset.CreateInstance(_uuidof(Recordset));
      m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
      //GWAM001_FUNC01(bstrSQL);/**/
      ::SysFreeString((_bstr_t)bstrSQL);
      if(m_pRecordset -> adoEOF)
      {
       *p = NULL;
       m_pRecordset ->Close();
       //m_pRecordset ->Release();
       return true;
      }
      m_pRecordset -> MoveFirst();
      if(!m_pRecordset -> adoEOF) 
      {
       //_bstr_t eValue = (char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("name"))->Value);
       _variant_t eValue;
       eValue = m_pRecordset ->GetCollect(ValueName);
       
       if(eValue.vt == VT_NULL)  
       {
        *p =  NULL;
        //eValue.SetString("NULL");
        m_pRecordset ->Close();
        //m_pRecordset ->Release();
        return true;
       }
       /*int len = strlen((char*)(_bstr_t)eValue)+1;
       *p = (char*)malloc(len);*/
       strcpy(p, (char*)(_bstr_t)eValue);
      }
      m_pRecordset ->Close();
      //m_pRecordset ->Release();
     }
     catch(_com_error e)
     {
      m_pRecordset ->Close();  
      cout<<e.Description()<<endl;  
      m_pConnection->Close();
      m_pConnection=NULL;
      return false;
     }
     
     return true;
    }
    bool ADOCallDB::Execute(const char * bstrSQL)
    {
     _RecordsetPtr m_pRecordset;
     try
     {
      //是否已经连接数据库
      if(m_pConnection == NULL)
      {   
       if(!InitADOCom())
       {
        m_pConnection = NULL;
        return false;
       }
      }
      m_pConnection->CommandTimeout = 600;
      m_pConnection->Execute(bstrSQL,NULL,adModeUnknown/*adCmdText*/);
      
      
     }
     catch(_com_error e)
     {
      
      cout << (char*)e.Description() << endl;
      
      return false;
     }
     return true;
    }

你可能感兴趣的:(oracle,DB,sqlserver,ADO)