c++ ado 访问 数据库(sqlserver)或其他数据库 实现增、删、改、查、执行存储过程

          最近项目需要用C++访问SQLServer数据库,查了一下ado比较方便且通用,于是就总结了一下,废话不多说直接上代码

ADO.h


#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") rename("BOF","adoBOF")

#define SQL_MAX_SIZE 256
#define TIME_STR_SIZE 128
#define MAX_BUFF 512

//SqlCommand参数结构体
typedef struct _sqlParameter
{
	std::string varName;			//变量名称
	DataTypeEnum varType;		//变量类型
	ParameterDirectionEnum createType;	//创建类型
	int varSize;							//变量大小
	std::string value;					//值
} SqlParameter;


class ADO
{
public:
	_ConnectionPtr m_pConnection;					//连接对象指针
	_RecordsetPtr  m_pRecordset;					//记录集对象指针
	_CommandPtr m_pCommand;
public:
	ADO();
	virtual ~ADO();
	void OnInitADOConn();							//连接数据库
	_RecordsetPtr&  OpenRecordset(const char* sql);		//打开记录集
	void CloseRecordset();							//关闭记录集
	void CloseConn();								//关闭数据库连接
	UINT GetRecordCount(_RecordsetPtr pRecordset);	//获得记录数	
	bool ExecuteSQL(const char* sql);	//执行增删改
	bool SqlRecordList(const char* sql);//结果集的查询
	bool ExecuteSQLByProcedure(const char* spName, SqlParameter params[],int paramCount);//存储过程执行增删改
	bool SqlRecordListByProcedure(const char* spName, SqlParameter params[],int paramCount);//存储过程执行结果集的查询

	void WriteErrorLog(char* szMsg);//写错误日志
	void GetCurrentTimeStr(char *sztime);//得到当前日期
};

ADO.cpp

#include <fstream>
#include <windows.h>
#include <string>
#include "ADO.h"



ADO::ADO()
{

}

ADO::~ADO()
{

}

void ADO::OnInitADOConn()
{
	::CoInitialize(NULL);//初始化COM环境
	try
	{
		HRESULT hr = m_pConnection.CreateInstance("ADODB.Connection");  //创建连接对象实例 /*_uuidof(Connection)*/
		_bstr_t strConnect = "DRIVER={SQL Server};Server=此处填IP地址;DATABASE=此处填数据库名称;UID=此处填用户名;PWD=此处填密码";//连接语句 SQL SERVER
		m_pConnection->Open(strConnect, "", "", adModeUnknown); //打开连接数据库
	}
	catch (_com_error e)//捕获错误
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s", (char *)(e.Description()));
		WriteErrorLog(szLog);
	}
}

_RecordsetPtr&  ADO::OpenRecordset(const char* sql)
{
	try
	{
		m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
		m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
			adOpenDynamic, adLockOptimistic, adCmdText); 	//执行SQL得到记录集
	}
	catch (_com_error e)											//捕获可能的异常
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s[%s]", (char *)(e.Description()), sql);
		WriteErrorLog(szLog);
	}
	return m_pRecordset;
}

void ADO::CloseRecordset()
{
	if (m_pRecordset->GetState() == adStateOpen)	//判断当前的记录集状态
		m_pRecordset->Close();					//关闭记录集
}

void ADO::CloseConn()
{
	m_pConnection->Close();									//关闭数据库连接
	::CoUninitialize();										//释放COM环境
}

UINT ADO::GetRecordCount(_RecordsetPtr pRecordset)
{
	int nCount = 0;											//声明保存记录数的变量
	try {
		pRecordset->MoveFirst();								//将记录集指针移动到第一条记录
	}
	catch (...)												//捕捉可能出现的错误
	{
		return 0;											//产生错误时返回0
	}
	if (pRecordset->adoEOF)									//判断记录集中是否没有记录
		return 0;											//无记录时返回0
	while (!pRecordset->adoEOF)								//当记录集指针没有指向最后时
	{
		pRecordset->MoveNext();								//将记录集指针移动到下一条记录
		nCount = nCount + 1;								//记录个数的变量加1
	}
	pRecordset->MoveFirst();									//将记录集指针移动到第一条记录
	return nCount;											//返回记录数
}


bool ADO::ExecuteSQL(const char* sql)
{
	_variant_t RefreshNum;
	bool ret = false;
	try
	{
		//数据库是否已连接
		if (m_pConnection == NULL)
			OnInitADOConn();

		m_pRecordset = m_pConnection->Execute(_bstr_t(sql), &RefreshNum, adCmdText);

		if (RefreshNum.lVal > 0) {
			ret = true;
		}
		else {
			char szLog[MAX_BUFF];
			memset(szLog, 0, MAX_BUFF);
			sprintf_s(szLog, MAX_BUFF, "执行SQL命令受影响行数为0[%s]", sql);
			WriteErrorLog(szLog);
			ret = false;
		}
	}
	catch (_com_error e)
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s[%s]", (char *)(e.Description()), sql);
		WriteErrorLog(szLog);
		CloseConn();
		return false;
	}
	CloseConn();
	return ret;
}

void ADO::WriteErrorLog(char * szMsg)
{
	std::ofstream outFile;
	char sztime[TIME_STR_SIZE];

	outFile.open("Error.log", std::ios::out | std::ios::app);
	GetCurrentTimeStr(sztime);
	outFile << "【" << sztime << "】错误信息:" << szMsg << std::endl;

	outFile.close();
}

void ADO::GetCurrentTimeStr(char * sztime)
{
	SYSTEMTIME st;
	GetLocalTime(&st);
	sprintf_s(sztime, TIME_STR_SIZE, "%d-%02d-%02d %02d:%02d:%02d", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}

bool ADO::SqlRecordList(const char * sql)
{
	try
	{
		if (m_pConnection == NULL) {
			OnInitADOConn();
		}
		m_pRecordset = OpenRecordset(sql);
		m_pRecordset->MoveFirst();//定位到该数据集的第一行数据
	}
	catch (_com_error e)											//捕获可能的异常
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s[%s]", (char *)(e.Description()), sql);
		WriteErrorLog(szLog);
		CloseRecordset();
		CloseConn();//断开数据库连接
		return false;
	}
	return true;
}

bool ADO::ExecuteSQLByProcedure(const char * spName, SqlParameter params[], int paramCount)
{
	_variant_t RefreshNum;
	bool ret = false;
	try
	{
		if (m_pConnection == NULL) {
			OnInitADOConn();
		}

		HRESULT hr = m_pCommand.CreateInstance(__uuidof(Command));
		m_pCommand->ActiveConnection = m_pConnection;
		m_pCommand->CommandType = adCmdStoredProc;

		for (int i = 0; i < paramCount; i++) {
			_ParameterPtr pParam;
			pParam.CreateInstance(__uuidof(Parameter));
			pParam = m_pCommand->CreateParameter(_bstr_t(params[i].varName.c_str()), params[i].varType, params[i].createType, params[i].varSize, "1000");//给参数设置各属性
			pParam->Value = _variant_t(params[i].value.c_str());
			m_pCommand->Parameters->Append(pParam);//加入到Command对象的参数集属性中
		}


		m_pCommand->CommandText = _bstr_t(spName);
		m_pCommand->Execute(&RefreshNum, NULL, adCmdStoredProc);
		if (RefreshNum.lVal > 0) {
			ret = true;
		}
		else {
			char szLog[MAX_BUFF];
			memset(szLog, 0, MAX_BUFF);
			sprintf_s(szLog, MAX_BUFF, "执行SQL命令受影响行数为0[%s]", spName);
			WriteErrorLog(szLog);
			ret = false;
		}
	}
	catch (_com_error e)
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s[%s]", (char *)(e.Description()), spName);
		WriteErrorLog(szLog);
		ret = false;
	}
	CloseConn();
	return ret;
}

bool ADO::SqlRecordListByProcedure(const char * spName, SqlParameter params[], int paramCount)
{
	try
	{
		if (m_pConnection == NULL) {
			OnInitADOConn();
		}

		HRESULT hr = m_pCommand.CreateInstance(__uuidof(Command));
		m_pCommand->ActiveConnection = m_pConnection;
		m_pCommand->CommandType = adCmdStoredProc;

		for (int i = 0; i < paramCount; i++) {
			_ParameterPtr pParam;
			pParam.CreateInstance(__uuidof(Parameter));
			pParam = m_pCommand->CreateParameter(_bstr_t(params[i].varName.c_str()), params[i].varType, params[i].createType, params[i].varSize,"1000");//给参数设置各属性
			pParam->Value = _variant_t(params[i].value.c_str());
			m_pCommand->Parameters->Append(pParam);//加入到Command对象的参数集属性中
		}

		m_pCommand->CommandText = _bstr_t(spName);
		m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdStoredProc);
		m_pRecordset->MoveFirst();//定位到该数据集的第一行数据
	}
	catch (_com_error e)
	{
		char szLog[MAX_BUFF];
		memset(szLog, 0, MAX_BUFF);
		sprintf_s(szLog, MAX_BUFF, "执行SQL命令错误:%s[%s]", (char *)(e.Description()), spName);
		WriteErrorLog(szLog);
		return false;
	}

	return true;
}

源码下载地址:https://download.csdn.net/download/sunsddd/12083953

技术交流,可以加群 690018451

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萝卜兽编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值