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

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

对于在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/it185.htm