这几天封装了Win32 SDK 下操作数据库类 GlADO
GlADO.h
#pragma once
#include <windows.h>
#include <atlstr.h>
//引入ADO库文件
#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")
//数据库类的封装
class GlADO
{
public:
GlADO();
~GlADO();
public:
//打开数据库连接
BOOL OpenConn(CString connStr);
//关闭数据库连接
void CloseConn();
//获得数据库错误信息提示
void GetComError(CString str, _com_error e);
//获得查询记录集
_RecordsetPtr GetRecordset(CString sql);
//关闭记录集
void CloseRecordset(_RecordsetPtr pRecordPtr);
//执行命令操作数据库
BOOL ConnExecute(CString sql);
//带参数查化格式操作数据库命令
// arrPars: 参数列表
// nParsCount: 参数数组大小
int CommandExecute(CString sql, _ParameterPtr* arrPars,int nParsCount);
//设置参数格式化
void SetParameters(_ParameterPtr* arrPars, _variant_t var, DataTypeEnum daTyple, int nVarSize);
//初始化连接字符串
static void InitConn(CString _connStr);
//获得GlADO*指针(单实例)
static GlADO* GetADO();
private:
_ConnectionPtr pConn;//数据库连接对象
static CString connStr;
static GlADO* pAdo;
};
GlADO.cpp
#include "GlADO.h"
GlADO* GlADO::pAdo = nullptr;
CString GlADO::connStr = "";
GlADO::GlADO()
{
::CoInitialize(NULL);//初始化ADO环境
pConn = nullptr;
}
GlADO::~GlADO()
{
if (pConn != nullptr)
{
pConn.Release();
pConn = nullptr;
}
::CoUninitialize();//释放ADO环境
}
BOOL GlADO::OpenConn(CString connStr)
{
if(pConn==nullptr)
pConn.CreateInstance(__uuidof(Connection));
try
{
if(pConn->GetState()== adStateClosed)
pConn->Open(_bstr_t(connStr), TEXT(""), TEXT(""), adModeUnknown);
}
catch (_com_error e)
{
GetComError(TEXT("数据库连接失败!"), e);
return FALSE;
}
return TRUE;
}
void GlADO::CloseConn()
{
if (pConn->State)
{
pConn->Close();
}
}
void GlADO::GetComError(CString str, _com_error e)
{
CString errorStr;
errorStr.Format(TEXT("%s\n\n错误编号:%o8lx\n错误信息:%s\n错误源:%s\n错误描述:%s"),
str, //自定义错误信息
e.Error(), //错误编号
e.ErrorMessage(), //错误信息
(LPCTSTR)e.Source(),//错误源
(LPCTSTR)e.Description());//错误描述
::MessageBox(GetActiveWindow(), errorStr, TEXT("错误提示"), MB_ICONEXCLAMATION);
}
_RecordsetPtr GlADO::GetRecordset(CString sql)
{
OpenConn(connStr);
_RecordsetPtr pRecorPtr;
pRecorPtr.CreateInstance(__uuidof(Recordset));
try
{
pRecorPtr->Open(_variant_t(sql),
pConn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
//OutputDebugString(TEXT("数据库连接成功!"));
}
catch (_com_error e)
{
GetComError(TEXT("记录集打开错误!"), e);
return nullptr;
}
return pRecorPtr;
}
void GlADO::CloseRecordset(_RecordsetPtr pRecordPtr)
{
pRecordPtr->Close();
pRecordPtr.Release();
pRecordPtr = nullptr;
}
BOOL GlADO::ConnExecute(CString sql)
{
OpenConn(connStr);
_variant_t v;
pConn->Execute(_bstr_t(sql), &v, adCmdText);
pConn->Close();
return v.intVal > 0;
}
int GlADO::CommandExecute(CString sql, _ParameterPtr * arrPars, int nParsCount)
{
OpenConn(connStr);
_CommandPtr pCmd = nullptr;
_RecordsetPtr pRst = nullptr;
_variant_t vResult = 0;
try
{
pCmd.CreateInstance(__uuidof(Command));
pCmd->ActiveConnection = pConn;
pCmd->CommandText = _bstr_t(sql);
pCmd->CommandType = adCmdText;
//添加参数列表
if (arrPars != NULL)
{
for (int i = 0; i < nParsCount; i++)
{
pCmd->Parameters->Append(arrPars[i]);
}
}
pRst = pCmd->Execute(&vResult, NULL, NULL);
pCmd.Release();
CloseConn();
return vResult.intVal;
}
catch (_com_error e)
{
GetComError(TEXT("执行命令出错"), e);
return 0;
}
return 0;
}
void GlADO::SetParameters(_ParameterPtr* arrPars, _variant_t var, DataTypeEnum daTyple, int nVarSize)
{
arrPars[0].CreateInstance(__uuidof(Parameter));
arrPars[0]->PutValue(var); //参数化要设置的值
arrPars[0]->PutDirection(adParamInput);
arrPars[0]->PutType(daTyple); //数据类型
arrPars[0]->PutSize(nVarSize); //数据大小
}
void GlADO::InitConn(CString _connStr)
{
connStr = _connStr;
}
GlADO * GlADO::GetADO()
{
if (pAdo == nullptr)
pAdo = new GlADO;
return pAdo;
}