win32封装ADO数据库类

这几天封装了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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值