一、ADO简介
ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB
,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。本文将详细地介绍在VC
下如何使用ADO来进行数据库应用程序开发,并给出示例代码。
本文示例代码
本文示例代码
二、基本流程
万事开头难,任何一种新技术对于初学者来说最重要的还是“入门”,掌握其要点。让我们来看看ADO数据库开发的基本流程吧!
(1)初始化COM库,引入ADO库定义文件
(2)用Connection对象连接数据库
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
1COM库的初始化
我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:
万事开头难,任何一种新技术对于初学者来说最重要的还是“入门”,掌握其要点。让我们来看看ADO数据库开发的基本流程吧!
(1)初始化COM库,引入ADO库定义文件
(2)用Connection对象连接数据库
(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
1COM库的初始化
我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:
BOOL CADOTest1App::InitInstance()
{
AfxOleInit();
}
2.用#import指令引入ADO类型库
我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在FileView中的Header Files里找到)
{
AfxOleInit();
}
2.用#import指令引入ADO类型库
我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在FileView中的Header Files里找到)
#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。
这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。
几点说明:
(1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改
(2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
(1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改
(2) 在编译的时候肯能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
CAdoConnection类的定义
class CAdoConnection
{
public:
CAdoConnection();
virtual ~CAdoConnection();
void OnInitADOConn();//连接数据库
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行Insert UpDate Delete
_RecordsetPtr & GetRecordSet(_bstr_t bstrSQL);//执行查询
private:
_ConnectionPtr m_pConnection;//添加一个指向Connection对象的指针
_RecordsetPtr m_pRecordset;//添加一个指向RecordSet对象的指针
class CAdoConnection
{
public:
CAdoConnection();
virtual ~CAdoConnection();
void OnInitADOConn();//连接数据库
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行Insert UpDate Delete
_RecordsetPtr & GetRecordSet(_bstr_t bstrSQL);//执行查询
private:
_ConnectionPtr m_pConnection;//添加一个指向Connection对象的指针
_RecordsetPtr m_pRecordset;//添加一个指向RecordSet对象的指针
};
//类的实现
CAdoConnection::CAdoConnection()
{
::CoInitialize(NULL); //初始化OLE/COM库环境
}
CAdoConnection::~CAdoConnection()
{
//关闭记录集和连接
if(m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize(); //释放程序占用的COM资源
}
{
//关闭记录集和连接
if(m_pRecordset != NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize(); //释放程序占用的COM资源
}
void CAdoConnection::OnInitADOConn()// 连接数据库
{
try
{
m_pConnection.CreateInstance("ADODB.Connection");//创建Connection 对象
_bstr_t strConnect = "driver={SQL Server};Server=(local);DATABASE=数据库名称;UID=sa;PWD=你的sa登陆密码;";
{
try
{
m_pConnection.CreateInstance("ADODB.Connection");//创建Connection 对象
_bstr_t strConnect = "driver={SQL Server};Server=(local);DATABASE=数据库名称;UID=sa;PWD=你的sa登陆密码;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());//显示错误信息
}
}
}
catch(_com_error e)
{
AfxMessageBox(e.Description());//显示错误信息
}
}
BOOL CAdoConnection::ExecuteSQL(_bstr_t bstrSQL)//执行Insert UpDate
{
try
{
//是否已经连接到数据库
if(m_pConnection == NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
{
try
{
//是否已经连接到数据库
if(m_pConnection == NULL)
OnInitADOConn();
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
_RecordsetPtr& CAdoConnection::GetRecordSet(_bstr_t bstrSQL)//执行查询
{
try
{
//连接数据库 如果Connection对象为空则重新连接数据库
if(m_pConnection==NULL)
OnInitADOConn();
//创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));
//取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockBatchOptimistic,adCmdText);
}
catch (_com_error e)
{
//异常 显示错误信息
AfxMessageBox(e.Description());
}
return m_pRecordset;
}
需要用连接数据库的时候直接定义一个对象即可。