windows提供给我们操作数据库的dll,在mfc中通过COM来调用dll,进而来操作数据库。
#pragma once
#import "C:\\Program Files (x86)\\Common Files\\System\\ado\\msado15.dll" no_namespace
rename("EOF","ADOEOF") rename("BOF","ADOBOF")
#define DATEBASE_TYPE_ACCESS 0
#define DATEBASE_TYPE_SQL2000 1
#define DATEBASE_TYPE_SQL2005 2
#define DATEBASE_TYPE_OTHER 3
.h文件
class CDao
{
public:
CDao(void);
BOOL InitCom(); //初始化com组件
void releaseCom(); //释放com组件
public:
~CDao(void);
//打开数据库并进行初始化
BOOL OpenDateBase(CString strDateBaseName,int nDataType,CString strUser,CString strPassWord,CString strIP);
BOOL CStringToDataType(CString strValue,int nDataType, VARIANT *pVar);//CString转成其他数据类型
BOOL GetData(CString strSql,CString *strQueryCloum,int nCloumNum,CStringArray& strDataValue);//从数据库获取数据
CString DataToCStringType(VARIANT Var);
BOOL AddData(CString strTableName,CStringArray& strCloumValue,int nCloumNum);
BOOL EditData(CString strSQL, int nColumnNum, CString* pStrFieldName, CStringArray &saValue);
BOOL DeleteData(CString strSQL);
public:
_ConnectionPtr m_pConnection; //连接数据库的指针对象
_RecordsetPtr m_pRecordset; //操作记录集的指针对象
_CommandPtr m_pCommandmsg; //SQL命令的指针对象
private:
BOOL m_binitComFlag;
CString m_strErrorMsg; //错误信息
CString m_strConnect; //连接串
};
.cpp文件
#include "StdAfx.h"
#include
#include "Dao.h"
CDao::CDao(void)
{
m_binitComFlag = FALSE;
InitCom();
}
CDao::~CDao(void)
{
releaseCom();
}
BOOL CDao::InitCom() //初始化com组件
{
#if _WIN32_WINNT > 0x500
//保留字(必须为null) ,加载方式 COINIT_MULTITHREADED多线程的方式加载
// 以多线程方式打开com通道
::CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
::CoInitialize(NULL);
#endif
m_binitComFlag = TRUE;
return TRUE;
}
void CDao::releaseCom() //释放com组件
{
if (m_binitComFlag)
{
::CoUninitialize();
}
}
//哪个什么类型的数据库
BOOL CDao::OpenDateBase(CString strDateBaseName,int nDataType,CString strUser,CString strPassWord,CString strIP)
{
//"colin",DATEBASE_TYPE_SQL2005,"sa","sa","127.0.0.1,2433"
if (nDataType == DATEBASE_TYPE_ACCESS)
{
CFileFind filefind;
BOOL bFind = filefind.FindFile(strDateBaseName);
if (!bFind)
{
m_strErrorMsg = _T("找不到数据库");
return FALSE;
}
else
{
m_strConnect.Format(_T("provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"),strDateBaseName);
}
}
else if (nDataType == DATEBASE_TYPE_SQL2000)
{
m_strConnect.Format(_T("Driver={SQL Server};Server=%s;Uid=%s;Pwd=%s;Database=%s"),strIP,strUser,strPassWord,strDateBaseName);
}
else if (nDataType == DATEBASE_TYPE_SQL2005)
{
m_strConnect.Format(_T("Driver={SQL Native Client};Server=%s;Uid=%s;Pwd=%s;Database=%s"),strIP,strUser,strPassWord,strDateBaseName);
}
else
{
m_strErrorMsg = _T("没有合适的连库串");
return FALSE;
}
//实例化指针对象
HRESULT hRes;
//把CString转换成com组件里的字符串变量,COM能和数据库内容进行通信
_bstr_t bstrConnection(m_strConnect);
_bstr_t bstrUser(strUser);
_bstr_t bstrPassword(strPassWord);
try
{
//创建连接对象 序列码
hRes = m_pConnection.CreateInstance(__uuidof(Connection));
if (!SUCCEEDED(hRes))
{
m_strErrorMsg = _T("实例化连接指针对象失败");
return FALSE;
}
//连接数据库(连库串,用户名,密码,打开方式)
//字符串要用的是com组件的字符串 adModeShareDenyNone多用户共同可以访问一个数据库
hRes = m_pConnection->Open(bstrConnection,bstrUser,bstrPassword,adModeShareDenyNone);
if (!SUCCEEDED(hRes))
{
m_strErrorMsg = _T("打开数据库失败");
return FALSE;
}
//实例化数据集指针对象
hRes = m_pRecordset.CreateInstance(__uuidof(Recordset));
if (!SUCCEEDED(hRes))
{
m_strErrorMsg = _T("实例化数据集指针对象失败");
return FALSE;