VC中基于ADO访问数据库

来源:互联网 发布:linux查看检测网络命令 编辑:程序博客网 时间:2024/04/20 13:18

前提知识: 

       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();}

原创粉丝点击