一、首先我们学习一些预备知识
1、ADO是什么?
微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。
ADO是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性??远程数据服务,支持“数据仓库”ActiveX 组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。
2、Connection对象Recordset对象
最重要的三个ADO对象是Connection, Recordset和Command. 本文将主要介绍Connection和Recordset这两个对象。每个Connection的属性定义了与数据源的连接。Recordset对象接收来自数据源的数据。Recordset可以与Connection一起起使用,先建立一个连接,然后获取数据。尽管如此,Recordset也可以被单独创建,其Connection参数可以在Open属性定义。
3、ADO连接ACCESS数据库
ACCESS是一个关系型桌面数据库管理系统,它可以用来建立中小型号的数据库应用系统,使用非常广泛.下面介绍如何使用ADO连接ACCESS数据库.在连接数据库时,需要使用Connection对象的Open方法打开与数据源的连接.
ADO(ActiveX Data Objects)是一种操作 Microsoft 所支持的数据库的新技术。ADO可以看成是一系列的对象,应用这些功能强大的对象,即可轻松完成对数据库复杂的操作。
具体的操作步骤可以归纳为以下几步:
(1) 创建数据库源名(DSN)
(2) 创建数据库链接(Connection)
(3) 创建数据对象
(4) 操作数据库
(5) 关闭数据对象和链接
4、数据类型转换
由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据, 因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。_vatiant_t和_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。
二、在VC中使用ADO的开发步骤:
1、引入ADO库文件
ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,以及C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,读者可以在项目的目录下找到这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
在你自己创建的类或者头文件的开头用#import引入ADO库文件。
#import "C:\Program Files\Common Files\System\ado\msado15.dll"no_namespace \
rename("EOF","adoEOF")rename("BOF","adoBOF")
这句语句表明在工程当中使用ADO,但不使用它的命名空间,并且为了避免异常冲突,将EOF改为adoEOF,现在不需要添加另外的头文件,就可以使用ADO接口了。
值得注意到的是,ADO库是一组COM动态库,这意味着应用程序在调用ADO之前,必须初始化OLE/COM库环境。在MFC应用程序里面,一个比较好用的方法就是在应用程序主类的InitInstance成员函数里面初始化OLE/COM库环境。但是通常我们都将ADO接口封装成一个类,在类函数里面初始化,代码如下:
::CoInitialize(NULL); //初始化OLE/COM库环境
::CoUninitialize(); //关闭OLE/COM库环境,释放资源
AfxOleInit();//初始化OLE/COM库环境(MFC自带的)
3、使用ADO库的三个基本接口
ADO库包含三个基本接口:_ConnectionPtr接口、_RecordsetPtr接口和_CommandPtr接口。
其分别对应Connection对象(完成应用程序对数据源的访问连接)、Recordset对象(将查询的结果以记录集的方式存储)和Command对象(对已连接的数据源进行命令操作)。
(1)定义对象并创建对象实例:
方法一:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pCommand.CreateInstance(__uuidof(Command));
方法二:
_ConnectionPtr m_pConnection("ADODB.Connection");
_RecordsetPtr m_pRecordset("ADODB.Recordset");
_CommandPtr m_pCommand("ADODN.Command");
方法三:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;
m_pConnection.CreateInstance("ADODB.Connection");
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pCommand.CreateInstance("ADODN.Command");
这三种方法都是一样的,关键看你喜好。
(2)举例:
_ConnectionPtr接口:
主要用来连接数据库或者打开一个连接:
pConnection->Open(ConnectionString,"","",adModeUnknown);///连接数据库
ConnectionString如下:
1)访问Access 2000 :"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=databaseName;UserID=userName;Password=userPassWord"
2)访问ODBC数据 :"Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;"
3)访问Oracle数据库:“Provider=MSDAORA;DataSourse=serverName;User ID=userName;Password=userPassword;"
3)访问MS SQL数据库:"Provider=SQLOLEDB,Data Source=serverName;InitialCatalog=databaseName;User ID=userName;Password=userPassword;"
4)访问ADO数据库: "UserID=;Password=;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=shujuku.mdb;"
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
// 打开本地Access库shujuku.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=shujuku.mdb","","",adModeUnknown);
//SQL Server连接方法
_bstr_t strConnect ="Provider=SQLOLEDB; Server=billgates;Database=HrMan; uid=sa; pwd=sa;";//第一种
/*_bstr_t strConnect = "uid=;pwd=;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=shujuku.mdb;";*///第二种
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
_RecordsetPtr接口:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));//创建实例
CString sql;
sql.Format("SELECT * name FROM shujuku.mdb");//查询语句
try
{
m_pRecordset->Open(sql.GetBuffer(sql.GetLength()),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());//输出错误信息
}
CString strName;
while (!m_pRecordset->adoEOF)//读取数据
{
strName.Format("%s",(char*)(_bstr_t)m_pRecordset->GetCollect("姓名"));
m_listbox.AddString(strName);//把读出来的内容添加到列表框中
m_pRecordset->MoveNext();//移动记录集指针
}
当然读取数据的方法还有_bstr_t TheValue=m_pRecordset->Fields->GetItem("姓名")->Value;
_CommandPtr接口:(例子未经测试,以后再补上具体的说明)
_CommandPtr m_pCommand;
HRESULT hr = m_pCommand.CreateInstance(__uuidof(Command));
if(FAILED(hr))
{
AfxMessageBox("创建Command对象实例失败!");
}
CString strP_mailid;
_ParameterPtr param;
param=m_pCommand->CreateParameter("p_mailid",adVarChar,adParamOutput,strP_mailid.GetLength()+1,_variant_t(strP_mailid));
m_pCommand->Parameters->Append(param);
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandType = adCmdStoredProc;
m_pCommand->CommandText = _bstr_t("P_MAIL_SEND");
try
{
cmd->Execute(NULL,NULL,adCmdStoredProc);
}
catch (...)
{
AfxMessageBox("调用存储过程P_MAIL_SEND有错!");
}
try
{
strP_mailid = (char*)(_bstr_t)m_pCommand->Parameters->GetItem(_variant_t("p_mailid"))->GetValue();
}
catch (...)
{
strP_mailid = "";
}
m_pCommand.Detach();
三、模块化----VC中使用ADO的开发步骤(名字空间)
在你的项目文件中新建一个generic class 类,名字自取;
在该类当中添加ADO的三种类型的指针;
在该类当中添加6个函数,他们分别是:1)连接函数:主要完成COM接口的初始化和数据库的连接2)获取记录集函数:主要完成根据SQL语句来获取指向数据库当中的数据的记录集指针3)执行SQL语句函数4)断开数据库连接。
该模块下载地址:http://download.csdn.net/detail/csf111/3667364 欢迎下载交流。