前提知识:
OLE DB是基于COM库技术编写的,ADO是基于OLE DB的,它实际上是OLE DB的用户程序,ADO本身也是一个COM组件,COM组件在使用时,需要初始化COM库
基于ADO访问数据库主要用到三个核心对象:Connection对象、Command对象、Recordset对象
Connection : 该对象表示到数据库的连接,它管理应用程序和数据库之间的通信。
Recordset 和 Command 对象都有一个 ActiveConnection 属性,该属性用来引用 Connection 对象。
Command : 该对象用来处理重复执行的查询,或处理需要检查在存储过程中调用的输出或返回参数的值的查询。
Recordset : 该对象用来获取数据。Recordset 对象存放查询的结果,这些结果由数据的行和列组成。
ADO对象是由 msado15.dll 动态库提供的,所以在VC中利用ADO访问数据库时,先需要导入ADO库,如下:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "rsEOF")
上述代码用使用 no_namespace 关键字,意为不使用命名空间,主要是为了访问方便,在程序中可以直接访问ADO提供的 Connection、Command 和 Recordset 这三个COM接口
EOF表示记录集的结尾,由于文件也是以EOF结尾的,为避免冲突,在导入ADO库时,需要将EOF重命名。
注:在VC中利用ADO访问数据库时都会存在警告提示,对程序没有影响
警告:d:\ado\debug\msado15.tlh(407) : warning C4146 : unary minus operator applied to unsigned type, result still unsigned
void QuerySql()
{
CoInitialize(NULL); //调用CoInitialize函数来初始化COM库
_ConnectionPtr pConnection(__uuidof(Connection));
_RecordsetPtr pRecordset(__uuidof(Recordset))
pConnection->ConnectionString="Provider=SQLOLEDB.1; Password=sa; Persist Security Info=True; User=sa; Initial Catalog=pubs";
pConnection->Open("", "", "", adConnectUnspecified);
pRecordset=pConnection->Execute("SELECT * FROM 表名", NULL, adCmdText);
while(!pRecordset->rsEOF)
{
std::cout<<(_bstr_t)pRecordset->GetCollect("au_lname");
pRecordset->MoveNext();
}
pRecordset->Close();
pConnection->Close();
pRecordset->Release();
pConnection->Release();
CoUninitialize(); //调用CoUninitialize函数卸载COM库
}
上述代码中 _ConnectionPtr 类型是一个智能指针,在msado15.tlh文件中可看到该类型的定义:
_COM_SMARTPTR_TYPEDEF(_Connection, __uuidof(_Connection));
_COM_SMARTPTR_TYPEDEF 宏定义了 _ConnectionPtr 智能指针类型,允许用户访问 ADO Connection 对象
利用这个智能指针类定义ADO Connection对象: pConnection,使用关键字 __uuidof 获取 ADO Connection 接口的全局唯一标识符(GUID),对pConnection 对象进行初始 化。
利用记录集智能指针对象:pRecordset 来访问属性和方法。
调用Open方法打开与数据库的连接, 在VC中Open函数的定义可在msado15.tli文件中可看到:
inline HRESULT _Connection15::Open( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options);
ConnectionString 为连接字符串
类型 _bstr_t 是一个COM支持类,封装了BSTR数据类型, _bstr_t 类型的一种构造函数定义为:
_bstr_t( const char* s2) throw ( _com_error );
下面是利用Command智能指针对象来访问数据库
void QuerySql()
{
CoInitialize(NULL);
_ConnectionPtr pConnection(__uuidof(Connection));
_RecordsetPtr pRecordset(__uuidof(Recordset));
_CommandPtr pCommand(__uuidof(Command));
pConnection->ConnectionString="Provider=SQLOLEDB.1; Password=sa; Persist Security Info=True; User ID = sa; Initial Catalog=pubs";
pConnection->Open("", "", "", adConnectUnspecified);
pCommand->put_ActiveConnection(_variant_t((IDispatch*)pConnection));
pCommand->CommandText="SELECT * FROM 表名";
pRecordset=pCommand->Execute(NULL, NULL, adCmdText);
while(!pRecordset->rsEOF)
{
std::cout<<(_bstr_t)pRecordset->GetCollect("au_lname");
pRecordset->MoveNext();
}
pRecordset->Close();
pConnection->Close();
pCommand->Release();
pRecordset->Release();
pConnection->Release();
CoUninitialize();
}