最近项目需要用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