编程语言 程序设计交流站


Join the forum, it's quick and easy

编程语言 程序设计交流站
编程语言 程序设计交流站
Would you like to react to this message? Create an account in a few clicks or log in to continue.
编程语言 程序设计交流站

欢迎关顾本站,在这里你可以畅所欲言,提出你要解决的问题,各路高手会给你一个圆满的答复,另外有各种源代码、源程序等供你下载。vb vc c++ c# delphi 易语言 Java PASCAL VFP JS VBS Pascal SQL...>


您没有登录。 请登录注册

VC++学习:调用ADO的常用方法

向下  留言 [第1页/共1页]

Admin

Admin
Admin

概述

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

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

{

try

{

RecordsetPtr ptrRS; // recordset 对象

//创建recordset 对象实体

ptrRS.CreateInstance(__uuidof(Recordset));

ptrRS->Open( strSql,

ptrConn.GetInte***cePtr(),

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, _ConnectionPtrptrConn);

{

// 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错误取得

ErrorPtrpErr = 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://proj.my-rpg.com

返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题