传统的ODBC技术只能访问关系型数据库,且访问速度慢,因此,微软推出了OLE DB(应用在数据库上的对象连接于嵌入)和ADO(ActiveX data Object),OLE DB和ADO都是基于COM接口的技术,使用这种技术可以直接对数据库的驱动程序进行访问,大大提高了访问速度。同时,OLE DB和ADO不仅可以访问关系型数据库,还可以访问非关系型数据库。

ADO建立在OLE DB之上,ADO是一个DLE DB用户程序,使用ADO的应用程序都要间接地使用DLE DB。ADO简化了OLE DB,提供了对自动化的支持,使得像VBScript这样的脚本语言也能够使用ADO访问数据库。
ADO中有三个核心对象:
1)Connection对象
Connection对象表示到数据库的连接,它管理应用程序和数据库之间的通信。Recordset和Command对象都有一个ActiveConnection属性,该属性就是用来引用Connection对象的;
2)Command对象
Command对象用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询;
3)Recordset对象
Recordset对象用来获取数据。Recordset对象存放查询的结果,这些结果由数据的行(记录)和列(字段)组成。每一列都存放在Recordset的Fileds集合中的一个Field对象中。

其他的对象包括:字段对象(Field)、记录对象(Record)、参数对象(Parameter)、错误对象(Error)、属性对象(Property)和流对象(Stream)。
1)Fields集合和Field对象:Recordset对象包含一个用于处理行集的各个Fields对象集合。行集中返回的每一列在Fields集合中都有一个相关的Field对象,它允许用户访问列名、列数据类型以及当前列中的实际值。
2)Parameters集合和Parameter对象:Command对象包含一个Parameters集合,它包含于命令有关的所有参数。Parameter对象代表参数或与基于参数化查询或存储过程的Command对象相关联的参数。
3)Errors集合和Error对象:Connection对象包含一个Errors集合。Error对象包含于单个操作有关的数据访问错误的详细信息。每个错误出现时,一个或多个Error对象将被放到Errors集合中,通过Error对象的属性可获得每个错误的详细信息。

ADO开发步骤分为:
1)引入ADO动态链接库;
2)初始化OLE/COM库环境;
3)用Connection对象连接数据源;
4)打开记录,进行数据操作;
5)程序退出,断开数据库连接。

在VC中利用ADO访问数据库时,需要导入ADO库(msado15.dll),方法是利用import指令将此动态链接库导入:
#import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename ("EOF", "aceEOF")
上面代码no_namespace表示不使用命名空间,主要是为了访问方便,在程序中可以直接访问ADO提供的Connection、Command和Recordset这三个COM接口。rename表示将EOF改为aceEOF,EOF表示记录集的结尾,但由于文件也是以EOF结尾的,因此,为了避免冲突,在导入ADO库时,需要将EOF改为另一个名字,如aceEOF。
查询的关键代码如下:
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connnection));
_RecordsetPtr pRs(__uuidof(Recordset));
pConn->ConnectionString="Provider=SQLOLEDB.1; Password=sa; Persist Security Info=True; User ID=sa; Initial Catalog=pubs";
pConn->Open("", "", "", adConnectUnspecified);
pRs = pConn->Execute("select * from authors", NULL, adCmdText);

while(!pRs->aceEOF)
{
//输出字段,如pRs->GetCollect("name");
....
pRs->MoveNext();
}

pRs->Close();
pConn->Close();
pRs.Release();
pConn.Release();
CoUninitialize();

我们也可以利用记录集智能指针对象直接执行SQL查询语句,从而获得记录集数据,例如,将上面代码pRs = pConn->Execute("select * from authors", NULL, adCmdText);替换为:
pRs->Open("select * from authors", _variant_t((IDispatch*)pConn),
adOpenDynamic, adLockOptimistic, adCmdText);
即可。

我们同样可以利用Command智能指针对象来访问数据库:
CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connnection));
_RecordsetPtr pRs(__uuidof(Recordset));
_CommandPtr pCmd(__uuidof(Command));
pConn->ConnectionString="Provider=SQLOLEDB.1; Password=sa; Persist Security Info=True; User ID=sa; Initial Catalog=pubs";
pConn->Open("", "", "", adConnectUnspecified);
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="select * from authors";
pRs = pCmd->Execute(NULL, NULL, adCmdText);
while(!pRs->aceEOF)
{
//输出字段,如pRs->GetCollect("name");
....
pRs->MoveNext();
}

pRs->Close();
pConn->Close();
pCmd.Release();
pRs.Release();
pConn.Release();
CoUninitialize();