1、创建实例工程
创建一个MFC基于对话框的用用程序,工程名为Ado。界面布局如图1所示
图1 VC连接数据库界面布局示意图
2、导入库文件
使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。代码如下:
// 加入ADO支持库
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace \
rename ("EOF", "adoEOF")
ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,
并以此创建一组C++头文件。这些头文件具有.tli 和.tlh扩展名,#import引入ADO库文件的代码编译后,在项目的目录下生成了这两个文件。在C++程序代码中调用的ADO类要在这些文件中定义。
程序的第er行指示ADO对象不使用名称空间,在有些应用程序中,
由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。
如果要使用名称空间,则可把第三行程序修改为: rename_namespace("AdoNS")。
第三行代码将ADO中的EOF(文件结束)更名为adoEOF,因为文件的结尾也是以EOF结尾的,是为了避免与定义了自己的EOF的其他库冲突。 至于改为什么名字,可以根据自己的命名习惯自己确定。
3、初始化COM环境
OLE DB 是基于COM技术编写的,ADO是OLE DB基础之上的用户程序,
OLE DB是一个COM组件,在访问COM组件的时候需要初始化COM库,方法如下:
(1) ::CoInitialize(NULL); //初始化OLE/COM库环境
//对数据库的访问在上下代码之间写,下面第三步就应该写在这里
::CoUninitialize();//既然初始化了环境,当然一定要记得释放他了
(2)也可以调用MFC全局函数
AfxOleInit();
4、 给查询按钮添加消息响应事件,代码如下:
void CAdoDlg::OnBtnQuery()
{
// 初始化OLE/COM库环境
CoInitialize(NULL);
//_ConnectionPtr 智能指针定义一个连接对象同时对这个对象进行初始化
_ConnectionPtr pConn(__uuidof(Connection));
//记录集的指针对象同上
_RecordsetPtr pRst(__uuidof(Recordset));
// 打开本地Access库Demo.mdb
//这里说明一下Demo.mdb 是 一个Access数据库文件表名DemoTable 两个字段姓名和年龄
//存放在系统的当前目录(和源文件至于同一目录)
pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
pRst=pConn->Execute(_T("SELECT * FROM DemoTable"),NULL,adCmdText);
while(!pRst->adoEOF)
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect(_T("Name")));
pRst->MoveNext();
//((CListBox*)GetDlgItem(IDC_LIST1))->AddString((_bstr_t)pRst->GetCollect(_T("Age")));
//pRst->MoveNext();
}
//关闭记录集
pRst->Close();
//关闭连接
pConn->Close();
//释放智能指针在COM接口上的引用计数注意是.不是->
pRst.Release();
pConn.Release();
// 卸载OLE/COM库环境
CoUninitialize();
}
注:注意需要添加一个数据库文件
5、查询结果
点击查询,列表框中显示数据库文件中存放的数据集。
示意图如图2所示:
图2 查询结果名称示意图
图3 查询结果年龄示意图
至此,利用ADO访问数据库的过程已经结束,可以访问数据库中的数据。后续再补充对数据库文件中的数据进行操作的实现。
说明:本地的数据库文件Demo.mdb 用Excel打开如图三所示:
图4 数据库中存放数据示意图
和程序执行结果进行比较可以发现数据的顺序是不一致的,名称按照首字母,数字按照递增的顺序,这个问题慢慢再研究。
待完善