vc++中调用ADO的常用方法

原创 2003年12月25日 10:27:00

VC++中调用ADO的常用方法

概述

 

对于在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

 

2COM 使用时初始化

   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;        // 默认返回值

        _ConnectionPtr  ptrConn; // 定义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, _ConnectionPtr  ptrConn)

{

        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 ; iIndex < lColCount; iIndex++)

                {

                  l_vaIndex.iVal = iIndex; // 设置循环索引

                  // 取得字段名称

           sprintf(strColNames[iIndex], "%s",

 (LPSTR)ptrRs ->Fields->GetItem(l_vaIndex)->Name);

                          // 取得字段属性

                  iColTypes = ptrRs ->Fields->GetItem(l_vaIndex)->Type;

                }

          }

          return S_OK;

        }

        catch(_com_error &a_pComError)

        {

                …. // 错误处理

                return E_UNEXPECTED;

        }

        catch(...)

        {

                …. // 错误处理

                return E_UNEXPECTED;

        }

}

 

6.通过数据集(recordset)得到当前行记录

HRESULT getOneRecord(

_RecordsetPtr ptrRs,

const long lNoOfColumns,

_variant_t varValue[])

{

        try

        {

                // 参数变量

_variant_t l_vaIndex;

                l_vaIndex.vt = VT_I2;

                // 循环取得列的值

for(long lIndex = 0; lIndex < lNoOfColumns; lIndex ++)

                {

                  l_vaIndex.iVal = lIndex;

                  // 取得字段值

                  varValue[lIndex]=

                     ptrRs->Fields->GetItem(l_vaIndex)->Value;

                }

                return S_OK;

        }

        catch(_com_error &a_pComError)

        {

                …. // 错误处理

                return E_UNEXPECTED;

        }

        catch(...)

        {

                …. // 错误处理

                return E_UNEXPECTED;

        }

}

 

7.出错情况下错误信息的取得

void ErrorFunc(_com_error &pComError, _ConnectionPtr  ptrConn);

{

 

// COM 错误取得

// 当执行COM功能的时候,如果出错,可以捕捉到_com_error的异常

char lpComErrorStr512];

                sprintf(lpComErrorStr512,

"ErrorCode = %08lx /

Error Message = %s /

Source = %s /

Description = %s ",

pComError.Error(), // 错误编号

pComError.ErrorMessage(),// 错误信息

(LPCSTR) pComError.Source(),// 错误源

                        (LPCSTR) pComError.Description());// 错误描述

               

// 通过上面的代码我们可以看出,_com_error对象中可以得到COM所有出错的信息

// ADO错误取得

        ErrorPtr  pErr = NULL;

        if( (ptrConn ->Errors->Count) > 0)

        {

          long nCount = ptrConn ->Errors->Count;

          for(long i = 0; i < nCount; i++)

          {

            pErr = a_pConnPtr->Errors->GetItem(i);

            char l_pchErrorString[512];

            sprintf(l_pchErrorString,"Error:/n Error number: %x/t%s",

                    pErr->Number, // 错误编号

                       pErr->Description); // 错误描述

           }

        }

// ADO 处理出错的情况下, connection对象里面都有记录,可以通过访问

// connection 对象取得错误编号和错误信息。

VC++中使用ADO连接数据库step by step

最近坛子里经常有人问起在VC++中ADO访问数据库的问题,有的要么是连接字符串不正确,要么是忘了COM的初始化,还有的根本就没有导入ADO动态库文件(msado15.dll,也有自定义的)。在此本人做...
  • zxhx
  • zxhx
  • 2011年03月14日 21:51
  • 5008

vc++中ADO技术入门

摘要 本文简要介绍了在VC++ 6.0中使用 ADO进行客户端数据库编程的基本步骤,以及常见问题的解决方法,可供入门级的参考之用。    关键字 ADO VC++ 数据库编程 ADO 是...
  • coolboylai2
  • coolboylai2
  • 2012年07月01日 16:48
  • 3726

VC++ ADO操作总结

1、导入库文件 #import "C:\Program Files\commonfiles\system\ado\msado15.dll" no_namespace rename("EOF","En...
  • harvic880925
  • harvic880925
  • 2012年06月18日 19:32
  • 9592

20160229 VC++中使用ADO连接数据库

ADO 是目前在Windows环境中比较流行的客户端数据库编程技术。ADO是建立在OLE DB底层技术之上的高级编程接口,因而它兼具有强大的数据处理功能(处理各种不同类型的数据源、分布式的数据处理等...
  • KevinHuang2088
  • KevinHuang2088
  • 2016年02月29日 13:48
  • 2074

在VC6.0中使用ADO开发数据库应用程序

 在VC6.0中使用ADO开发数据库应用程序  使用ADO开发应用程序有两种方法,一种是直接在应用程序中使用ADO数据控件,该方法最简单,无需编写一行代码即可实现对数据库的访问,另一种方法是直接使用A...
  • upczap
  • upczap
  • 2007年12月11日 20:12
  • 981

VC++6.0中使用ADO方式操作ACCESS数据库(转载)

ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为...
  • slshelly
  • slshelly
  • 2011年12月06日 12:53
  • 3888

VC++ ado事务处理

VC++ ado事务处理
  • byxdaz
  • byxdaz
  • 2017年09月03日 11:27
  • 475

VC++ ADO方式访问数据库简要笔记

最近从电脑中翻出以前上课时所写的ADO方式访问数据库练习,因此也对其作个简单的笔记。呵呵,钻研的不是很深,高手轻拍~ 不过对初学者和做课程设计要使用VC++访问数据库的同学还是有所帮助的。 首先来回顾...
  • MoreWindows
  • MoreWindows
  • 2012年12月23日 16:21
  • 12898

在VC++中利用ADO连接数据库(附带模块下载链接)

一、首先我们学习一些预备知识 1、ADO是什么?         微软公司的ADO (ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方...
  • csf111
  • csf111
  • 2011年11月03日 23:27
  • 2602

VC使用ADO连接Oracle数据库详解(含源码下载)

ADO 主要对象介绍     ADO对象包括:连接对象(Connection Object)、命令对象 (Command Object) 、记录集对象(RecordSet  Object)、字段对...
  • risingsun001
  • risingsun001
  • 2012年05月20日 21:10
  • 5051
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc++中调用ADO的常用方法
举报原因:
原因补充:

(最多只允许输入30个字)