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

类别:VC语言 点击:0 评论:0 推荐:

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

 

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

        _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 对象取得错误编号和错误信息。

本文地址:http://com.8s8s.com/it/it1297.htm