VC编写ADO连接Access,SQL Server数据库入门实例

来源:互联网 发布:日本改良人种知乎 编辑:程序博客网 时间:2024/04/29 00:44
为了在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的数据绑定扩展.
 
例子代码如下:
       //数据库连接例子
       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("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
 
本文出自 “achilles” 博客,请务必保留此出处http://orajc.blog.51cto.com/458434/99310
原创粉丝点击