为方便在Visual C++中使用ADO访问数据库,可以对其进行适当的封装。
例如在MFC编程中,创建了一个基于对话框的应用程序。在菜单中选择Insert(插入)/New Class(),在Class type组合框中选择Generic Class,类名为ADOConn(类名随便),默认的类名为ADOConn.cpp。
在ADOConn.h文件中添加#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("BOF","adoBOF") rename("EOF","adoEOF")
ADOConn.h为
// ADOConn.h: interface for the ADOConn class.
//
//
#if !defined(AFX_ADOCONN_H__34CAEA73_3114_4B9A_A736_12F4093A4725__INCLUDED_)
#define AFX_ADOCONN_H__34CAEA73_3114_4B9A_A736_12F4093A4725__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("BOF","adoBOF") rename("EOF","adoEOF")
class ADOConn
{
//定义方法
public:
ADOConn();
virtual ~ADOConn();
void OnInitDBConn();//初始化-连接数据库
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询,返回结果集,bstrSQL只要执行的语句
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行查询不返回结果集
void ExitConnect();//断开数据库连接
//定义变量
public:
_ConnectionPtr m_PConnection;//指向Connection对象的指针
_RecordsetPtr m_pRecordset;//指向Recordset对象的指针
};
#endif // !defined(AFX_ADOCONN_H__34CAEA73_3114_4B9A_A736_12F4093A4725__INCLUDED_)
ADOConn.cpp为
// ADOConn.cpp: implementation of the ADOConn class.
//
//
#include "stdafx.h"
#include "ADOClass.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
ADOConn::ADOConn()
{
}
ADOConn::~ADOConn()
{
}
void ADOConn::OnInitDBConn()
{
//初始化OLE/COM库环境,为访问ADO接口做准备
::CoInitialize(NULL);
try
{
//创建Connection对象的实例
m_PConnection.CreateInstance("ADODB.Recordset");
_bstr_t strConnection = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=学生表;Data Source=CURT-PC";
m_PConnection->Open(strConnection,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if (m_PConnection==NULL)
{
OnInitDBConn();
}
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pRecordset->Open(bstrSQL,m_PConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
return m_pRecordset;//返回记录集
}
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
_variant_t RecordsAffected;
try
{
if (m_PConnection==NULL)
{
OnInitDBConn();
}
m_PConnection->Execute(bstrSQL,NULL,adCmdText);
return TRUE;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return FALSE;
}
}
void ADOConn::ExitConnect()
{
//关闭记录集和连接
if (m_pRecordset!=NULL)
{
m_pRecordset->Close();
}
m_PConnection->Close();
::CoUninitialize();//释放环境
}