1.引入msado.dll动态库
添加以下代码到*.cpp文件或者添加到*.h头文件(该头文件要被*.cpp文件引用),编译一次,自动生成msado15.tlh和msado15.tli文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
2.建立数据库交互类(使用面向过程编程可以将函数独立出来,类的私有成员可以设置成全局变量)
class CONN_DB
{
public:
void OnInitADOConn();//连接数据库
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询,返回记录集
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行SQL语句,不更新数据集的内容
void ExitConnect();//断开连接
void Check();
private:
_ConnectionPtr m_pConnection;//数据库连接指针,指向数据库
_RecordsetPtr m_pRecordset;//记录集,返回查询结果
};
3.连接数据库函数(代码以MSSQL为例,其他数据连接连接字符串上有差异)
void CONN_DB::OnInitADOConn()
{
::CoInitialize(NULL);//初始化OLE/COM库环境
try
{
m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象
_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库名;Data Souese=.";//连接字符串
m_pConnection->Open(strConnect, "", "", adModeUnknown);//打开本地数据库
}
catch (_com_error e)
{
std::cout << e.Description() << std::endl;
}
}
Oracle数据库
Provider=OraOLEDB.Oracle;DATA SOURCE=ORCL;USER ID=system;PASSWORD=密码;//ORCL为数据库名,system为用户名
MySQL(首先需打开ODBC数据源(64位)新建名为MysqlODBC的DSN)
m_pConnection->Open("DSN=MysqlODBC;server=localhost;database=数据库名", "root", "密码", adModeUnknown);
m_pConnection->CursorLocation = adUseClient;//与客户端游标有关,否则无法返回记录条数
3.操作数据库(查询)并返回结果
_RecordsetPtr& CONN_DB::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if (m_pConnection == NULL)
OnInitADOConn();
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建记录集
m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);//使用adOpenStatic,可以调用记录集指针的函数返回记录个数
}
catch (_com_error e)
{
std::cout << e.Description() << std::endl;
}
return m_pRecordset;
}
4.执行SQL语句(插入、更新、删除等),不返回结果
BOOL CONN_DB::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
if (m_pConnection == NULL)
OnInitADOConn();
m_pRecordset = m_pConnection->Execute(bstrSQL, NULL, adCmdText);
return TRUE;
}
catch (_com_error e)
{
std::cout << e.Description() << std::endl;
return FALSE;
}
}
5.断开连接
void CONN_DB::ExitConnect()
{
if (m_pRecordset != NULL)
m_pRecordset->Close();//关闭记录集
m_pConnection->Close();//断开连接
::CoUninitialize();//释放环境
}
6.检查连接状态
void CONN_DB::Check()
{
if (m_pConnection->State == adStateOpen)
std::cout << "连接成功" << std::endl;
else
std::cout << "未连接" << std::endl;
}