您的位置: 设计首页>>网络编程>>VC++教程>>资源内容
VC++学习:调用ADO的常用方法
来源:xinsir/CSDN 时间:2009-01-08 点击:656次

    概述

      对于在WINDOWS上编写数据库程序的程序员来说,ActiveX Data Objects (ADO) 是最常使用的技术了,通过ADO可以简单的实现数据库的连接以及数据访问。但  是在VC++中使用ADO时,却因为是使用COM的方式来调用,常常出现一些系统无法编译通过,或使用中程序非法出错的问题,在这里想大概介绍一下VC++中调用ADO的常用方法。

      1、 用import导入ADO 的 COM 文件msado15.dll

      例如:

      #import "C:\Program Files\Common Files\System\ADO\msado15.dll"\

       no_namespace

      2、COM 使用时初始化

      HRESULT ComInit()

      {

      HRESULT hr = S_OK; // 默认返回值

      if FAILED(CoInitialize(NULL)) // COM 初始化调用

      {

       CoUninitialize();

       hr = E_UNEXPECTED;

      }

      return hr;

      }

      3、建立数据库连接

      HRESULT ConnectToDB( LPSTR pUserId ,// 用户名

      LPSTR pConnString, // 连接字串

      LPSTR pUserPassword , // 用户密码

      ConnectOptionEnum ConnectOption) //连接参数

      {

      HRESULT hr = S_OK;// 默认返回值

      _ConnectionPtrptrConn; // 定义Connection对象

      try

      {

       // 创建一个连接实体

      hr = ptrConn.CreateInstance(__uuidof(Connection));

       // 设定连接等待的最大秒数,默认是15秒

       ptrConn->ConnectionTimeout = 20

       // 打开连接

      hr = ptrConn->Open(pConnString,

       pUserId,

       pUserPassword,

       ConnectOption);

       return hr;

      }

      catch(_com_error &pComError)

      {

       …… // 错误处理

       return E_UNEXPECTED;

      }

      }

      4.执行一个SQL 查询,得到数据集(recordset)

      _RecordsetPtr GetRecordSet(LPSTR strSql, _ConnectionPtrptrConn)

      {

      try

      {

       RecordsetPtr ptrRS; // recordset 对象

       //创建recordset 对象实体

      ptrRS.CreateInstance(__uuidof(Recordset));

      ptrRS->Open( strSql,

      ptrConn.GetInterfacePtr(),

      adOpenForwardOnly,

      adLockUnspecified,

      adCmdText);

       或者

       ptrRS = ptrConn ->Execute(m_ strSql,NULL, adCmdText);

       return ptrRS;

      }

      catch(_com_error &a_pComError)

      {

       ….// 错误处理

       return NULL;

      }

      }

      5.通过数据集(recordset)得到列的名称

      HRESULT GetColumnNames(

      _RecordsetPtr ptrRs, // recordset 对象

      char strColNames[][255],

      DataTypeEnum iColTypes[])

      {

      try

      {// 参数变量

       _variant_t l_vaIndex;

       l_vaIndex.vt = VT_I2;

       // COLUMNS总数

      long lColCount;

       lColCount= ptrRs ->Fields->Count;

       // 循环取得列的属性和名称

       for(int iIndex = 0 ;