对于在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; // 设置循环索引