类定义
//AdoCallDB.h 定义 DLL类的头文件
//
#include
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;
};
函数实现
// AdoCallDB.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "AdoCallDB.h"
#include
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 <
return false;
}
}
catch(_com_error e)///捕捉异常
{
cout<
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<
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<
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<
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 <
return false;
}
return true;
}