转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
VC++中调用ADO的常用方法         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1541 更新时间:2009/4/23 10:43:04

对于在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",
                     pE

[1] [2]  下一页


[VB.NET程序]在VB中调用Windows API的注意事项  [Delphi程序]在Delphi中调用Flash
[Delphi程序]在Delphi.net中调用COM/COM+  [Delphi程序]在Delphi中调用CHM帮助文件
[VB.NET程序]在VB中调用CHM 帮助的几种方法  [VB.NET程序]在VBA中调用AUTOCAD打印文件
[VB.NET程序]如何在Store Procedure中调用VB  COM  [VB.NET程序]VB 中调用 Word 拼写检查
[网页制作]在IE中调用 Dreamweaver 编辑网页  [网页制作]在IE中调用Dreamweaver编辑网页
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台