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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

vc++中调ADO的常用方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

概述

 

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

 

1、 import导入ADO COM 文件msADO15.dll

例如:

#import "C:Program FilesCommon FilesSystemADOmsADO15.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(), // <script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

阅读更多
个人分类: VC和VC++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭