ado第一次亲密接触 -- ado开发实践之一
一、ado简介
ado(activex data object)是microsoft数据库应用程序开发的新接口,是建立在ole db之上的高层数据库访问技术,请不必为此担心,即使你对ole db,com不了解也能轻松对付ado,因为它非常简单易用,甚至比你以往所接触的odbc api、dao、rdo都要容易使用,并不失灵活性。本文将详细地介绍在vc下如何使用ado来进行数据库应用程序开发,并给出示例代码。
本文示例代码
二、基本流程
万事开头难,任何一种新技术对于初学者来说最重要的还是“入门”,掌握其要点。让我们来看看ado数据库开发的基本流程吧!
(1)初始化com库,引入ado库定义文件
(2)用connection对象连接数据库
(3)利用建立好的连接,通过connection、command对象执行sql命令,或利用recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
准备工作:
为了大家都能测试本文提供的例子,我们采用access数据库,您也可以直接在我们提供的示例代码中找到这个test.mdb。
下面我们将详细介绍上述步骤并给出相关代码。
【1】com库的初始化
我们可以使用afxoleinit()来初始化com库,这项工作通常在cwinapp::initinstance()的重载函数中完成,请看如下代码:
bool cadotest1app::initinstance()
{
afxoleinit();
......
【2】用#import指令引入ado类型库
我们在stdafx.h中加入如下语句:(stdafx.h这个文件哪里可以找到?你可以在fileview中的header files里找到)
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("eof","adoeof")
这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个c++头文件来定义ado库。
几点说明:
(1) 您的环境中msado15.dll不一定在这个目录下,请按实际情况修改
(2) 在编译的时候肯能会出现如下警告,对此微软在msdn中作了说明,并建议我们不要理会这个警告。
msado15.tlh(405) : warning c4146: unary minus operator applied to unsigned type, result still unsigned
【3】创建connection对象并连接数据库
首先我们需要添加一个指向connection对象的指针:
_connectionptr m_pconnection;
下面的代码演示了如何创建connection对象实例及如何连接数据库并进行异常捕捉。
bool cadotest1dlg::oninitdialog()
{
cdialog::oninitdialog();
hresult hr;
try
{
hr = m_pconnection.createinstance("adodb.connection");///创建connection对象
if(succeeded(hr))
{
hr = m_pconnection->open("provider=microsoft.jet.oledb.4.0;data source=test.mdb","","",admodeunknown);///连接数据库
///上面一句中连接字串中的provider是针对access2000环境的,对于access97,需要改为:provider=microsoft.jet.oledb.3.51;
}
}
catch(_com_error e)///捕捉异常
{
cstring errormessage;
errormessage.format("连接数据库失败!\r\n错误信息:%s",e.errormessage());
afxmessagebox(errormessage);///显示错误信息
}
在这段代码中我们是通过connection对象的open方法来进行连接数据库的,下面是该方法的原型
hresult connection15::open ( _bstr_t connectionstring, _bstr_t userid, _bstr_t password, long options )
connectionstring为连接字串,userid是用户名, password是登陆密码,options是连接选项,用于指定connection对象对数据的更新许可权,
options可以是如下几个常量:
admodeunknown:缺省。当前的许可权未设置
admoderead:只读
admodewrite:只写
admodereadwrite:可以读写
admodesharedenyread:阻止其它connection对象以读权限打开连接
admodesharedenywrite:阻止其它connection对象以写权限打开连接
admodeshareexclusive:阻止其它connection对象以读写权限打开连接
admodesharedenynone:阻止其它connection对象以任何权限打开连接
我们给出一些常用的连接方式供大家参考:
(1)通过jet数据库引擎对access2000数据库的连接
m_pconnection->open("provider=microsoft.jet.oledb.4.0;data source=c:\\test.mdb","","",admodeunknown);
(2)通过dsn数据源对任何支持odbc的数据库进行连接:
m_pconnection->open("data source=adotest;uid=sa;pwd=;","","",admodeunknown);
(3)不通过dsn对sql server数据库进行连接:
m_pconnection->open("driver={sql server};server=127.0.0.1;database=vckbase;uid=sa;pwd=139","","",admodeunknown);
其中server是sql服务器的名称,database是库的名称
connection对象除open方法外还有许多方法,我们先介绍connection对象中两个有用的属性connectiontimeout与state
connectiontimeout用来设置连接的超时时间,需要在open之前调用,例如:
m_pconnection->connectiontimeout = 5;///设置超时时间为5秒
m_pconnection->open("data source=adotest;","","",admodeunknown);
state属性指明当前connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:
if(m_pconnection->state)
m_pconnection->close(); ///如果已经打开了连接则关闭它
【4】执行sql命令并取得结果记录集
为了取得结果记录集,我们定义一个指向recordset对象的指针:_recordsetptr m_precordset;
并为其创建recordset对象的实例: m_precordset.createinstance("adodb.recordset");
sql命令的执行可以采用多种形式,下面我们一进行阐述。
(1)利用connection对象的execute方法执行sql命令
execute方法的原型如下所示:
_recordsetptr connection15::execute ( _bstr_t commandtext, variant * recordsaffected, long options ) 其中commandtext是命令字串,通常是sql命令。参数recordsaffected是操作完成后所影响的行数, 参数options表示commandtext中内容的类型,options可以取如下值之一:
adcmdtext:表明commandtext是文本命令
adcmdtable:表明commandtext是一个表名
adcmdproc:表明commandtext是一个存储过程
adcmdunknown:未知
execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
_variant_t recordsaffected;
///执行sql命令:create table创建表格users,users包含四个字段:整形id,字符串username,整形old,日期型birthday