为了在 VC 中使用 Ado, 需要在头文件中加入以下几行代码 :
#import "C:\\program files\\common files\\system\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")
#include "adoid.h"
#include "icrsint.h"
第一行的 #import 语句告诉编译器把此指令中的 DLL 文件引入到程序中 , 并从库中抽取其中的对象的类信息 , 并产生两个头文件包含在工程中 . 其中的 no_namespace 用来对 DLL 的名称域进行隔离 , 最后的 rename, ADO 中的 EOF 重新命名 , 避免和其他地方的定义的 EOF 产生冲突 .
第三行引入的头文件定义啦 ADO2.0 的类和接口标识
第四行引入了 ADO2.0 的数据绑定扩展 .
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

例子代码如下 :
       // 数据库连接例子
       AfxOleInit();// 初始化

      
      
      
       _ConnectionPtr m_pConnection;
   //_ConnectionPtr 对象用来实现和数据源的连接
       HRESULT hr = CoInitialize(NULL);
       m_pConnection.CreateInstance(__uuidof(Connection));

      
       //_bstr_t ConnectionString = "DSN=Test;UID=sa;PWD=;";//DSN---Access
       //_bstr_t ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Test.mdb";//NON_DSN---Access
       _bstr_t ConnectionString = "Provider=MSDASQL;DRIVER={SQL SERVER};SERVER=BILLGATES;DATABASE=NORTHWIND;UID=;PWD=;";//NON_DSN---SQL SERVER

       _bstr_t userName = "";
       _bstr_t password = "";
       _RecordsetPtr pRecordSet;
       _bstr_t bstrQuery("SELECT * FROM data");
       _variant_t vNull;
       vNull.vt = VT_ERROR;
       vNull.scode = DISP_E_PARAMNOTFOUND;
      
       try
       {
              m_pConnection->Open(ConnectionString,"","",adModeUnknown);

             
              hr = pRecordSet.CreateInstance(__uuidof(Recordset));

             
              if(SUCCEEDED(hr))
              {
                     pRecordSet->PutRefActiveConnection(m_pConnection);
                                          hr = pRecordSet->Open(_variant_t(bstrQuery),vNull,adOpenForwardOnly,adLockOptimistic,adCmdText);
                     AfxMessageBox(" 连接数据库成功 !");
                    
                           
                            if(!pRecordSet->adoEOF)
                            {
                                  
                                   _variant_t name = pRecordSet->GetCollect("name");// 获得指定列的数据

                                   CString strName = (char*)_bstr_t(name);// 转换数据类型

                                   AfxMessageBox(strName);
                                  
                                   COleSafeArray vaFieldlist;// 数据表字段名
                                   vaFieldlist.CreateOneDim(VT_VARIANT,3);
                                   long lArrayIndex[1];
                                   lArrayIndex[0] = 0;
                                   vaFieldlist.PutElement(lArrayIndex, &(_variant_t("name")));
                                   lArrayIndex[0] = 1;
                                   vaFieldlist.PutElement(lArrayIndex, &(_variant_t("age")));
                                   lArrayIndex[0] = 2;
                                   vaFieldlist.PutElement(lArrayIndex, &(_variant_t("address")));
                                  
                                  
                                   COleSafeArray vaValuelist;// 数据部字段值
                                   vaValuelist.CreateOneDim(VT_VARIANT,3);
                                   lArrayIndex[0] = 0;
                                   vaValuelist.PutElement(lArrayIndex, &(_variant_t("liuy")));
                                   lArrayIndex[0] = 1;
                                   vaValuelist.PutElement(lArrayIndex, &(_variant_t("23")));
                                   lArrayIndex[0] = 2;
                                   vaValuelist.PutElement(lArrayIndex, &(_variant_t("<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />beijing")));
                                  
                                   for(int i = 0; i< 2; i++)
                                   {
                                          pRecordSet->AddNew(vaFieldlist,vaValuelist);// 添加一行记录  

                                   }
                                   AfxMessageBox(" 添加数据成功 ");
                            }
              }
       }
       catch(_com_error &e)
       {
              _bstr_t bstrSource(e.Source());
              _bstr_t bstrDescription(e.Description());
       
              TRACE("Exception thrown for classes generated by #import");
              TRACE("\tCode=%O81x\n",e.Error);
              TRACE("\tCode meaning = %s\n",e.ErrorMessage);
        TRACE("\tSource = %s\n",(LPCTSTR)bstrSource);
              TRACE("\tDescription = %s\n",(LPCTSTR)bstrDescription);
             
              AfxMessageBox(e.ErrorMessage());
       }
_ConnectionPtr Open() 数的意义 :

ConnectionString: 包含连接信息的字符串

UID: 访问数据库的用户名

PSWD: 访问数据库的口令

Option: 可选参数

 

_RecordsetPtr Open() 函数 :
HRESULT Open(const _variant_t& source, const _variant_t& conneciton, enum CursorTypeEnum curdorType, enum LockTypeEnum lockType, long options)
Source 参数是一个变体类型 , 她可以是一个 Command 的对象 , SQL 对象 , 一个表名或一个存储过程 , 甚至是一个 URL, 一个文件名 , 一个流对象 .

Conneciton 也是一个变体类型 , 他可以是一个 connection 对象 , 也可以是一个指明连接目标的字符串 .

cursorType 指明了数据集游标的类型 . 她可以是以下几个值 :adOpenDynamic,adOpenForwardOnly,adOpenKeyset,adOpenStatic,adOpenUnspecified.

lockType 参数可以是下列值之一 :adLockBachOptiomistic,adlockOptimistic,adLockPessimistic,adLockReadOnly,adLockUnspecified.

Options: 参数指明了第一个参数 source 的类型 , 其值可以是 adCmdUnspecified,adCmdText,

adCmdTable,adCmdStoreProc,adCmdUnknow,adCmdFile,adCmdTableDirect