VC++ ADO开发实践之一[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 zswzwy 的 blog

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

本文关键:VC++中使用ADO
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top