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. 函数实现

// 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;
}

转载于:https://my.oschina.net/qihaitao/blog/395056

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值