手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

在Visual C 中用ADO进行数据库编程

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
ActiveX数据对象(ADO)是OLE DB上面的高层数据库API。我们在C++程式中也能够调用ADO。本文将在VC 6.0环境下做一个小小的例子解释如何使用ADO。

  1. 生成应用程式框架并初始化OLE/COM库环境

  创建一个标准的MFC AppWizard(exe)应用程式,然后在应用程式类的InitInstance函数中初始化OLE/COM库(因为ADO库是个COM DLL库)。

  BOOL CADOTestApp::InitInstance()

  { //初始化OLE/COM库环境

AfxOleInit();}

  2. 引入ADO库文档

  使用ADO前必须在工程的stdafx.h文档里用直接引入符号#import引入ADO库文档,以使编译器能正确编译。代码如下:

   #include 〈comdef.h〉

   #import ″c:\program files\common files\system\ado\msado15.dll″

   no_namespace

   rename (″EOF″, ″adoEOF″)

  头文档comdef.h使我们的应用程式能够使用Visual C++中的一些特别COM支持类,这些类使得处理OLE自治更为容易一些,OLE自治是ADO使用的数据类型。后三行使用#import指令在我们的应用程式中输入ADO类库定义。

  ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll)中,在其内部称为类型库。类型库描述了自治接口,连同C++使用的COM vtable接口。当使用#import指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文档。这些头文档具备.tli 和.tlh扩展名,读者能够在项目的目录下找到这两个文档。在C++程式代码中调用的ADO类要在这些文档中定义。

  程式的第三行指示ADO对象不使用名称空间。在有些应用程式中,由于应用程式中的对象和ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。假如要使用名称空间,则可把第三行程式修改为: rename—namespace(″AdoNS″)。第四行代码将ADO中的EOF(文档结束)更名为adoEOF,以避免和定义了自己的EOF的其他库冲突。

  3.利用智能指针进行数据库操作

  在CaboutDlg头文档中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。

  —ConnectionPtr m—pConnection;

  —RecordsetPtr m—pRecordset;

  ClistCtrl m—List;

  ADO库包含三个智能指针:—ConnectionPtr、—CommandPtr和—RecordsetPtr。

  —ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。

  —CommandPtr返回一个记录集。他提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。在使用—CommandPtr接口时,能够利用全局—ConnectionPtr接口,也能够在—CommandPtr接口里直接使用连接串。

  —RecordsetPtr是个记录集对象。和以上两种对象相比,他对记录集提供了更多的控制功能,如记录锁定、游标控制等。

  在OnInitDialog()中加入以下代码:

  BOOL CAboutDlg::OnInitDialog()

  {

CDialog::OnInitDialog();

—variant—t TheValue;

m—List.ResetContent();

  m—pConnection.CreateInstance(—uuidof(Connection));

  m—pRecordset.CreateInstance(—uuidof(Recordset));

  try{

m—pConnection-〉Open(″DSN=ADOTest″,″″,″″,0); //连接叫作ADOTest的ODBC数据源

m—pRecordset-〉Open(″SELECT  FROM BlockDefine″,(IDispatch)m—pConnection,

   :adOpenDynamic,

   adLockOptimistic,

   adCmdText);

  //执行SQL语句得到一个记录集

   while(!m—pRecordset-〉adoEOF)

  //遍历任何记录

   {

   TheValue = m—pRecordset-〉GetCollect(″BlockIndex″);

  //得到字段BlockIndex的值

   if(TheValue.vt!=VT—NULL)

   m—List.AddString((char)—bstr—t(TheValue)); //将该值加入到列表控件中

   m—pRecordset-〉MoveNext();

   : }

   m—pRecordset-〉Close();

m—pConnection-〉Close();

   }

   catch(—com—error e) //异常处理

   {

CString Error = e-〉ErrorMessage();

AfxMessageBox(e-〉ErrorMessage());

  }

  m—pRecordset = NULL;

m—pConnection = NULL;

  return TRUE; // return TRUE unless you set the focus to a control

  }

  程式中通过—variant—t和—bstr—t转换COM对象和C++类型的数据, —variant—t类封装了OLE自治VARIANT数据类型。在C++中使用—variant—t类要比直接使用VARIANT数据类型容易得多。

  好,编译后该程式就能运行了,但记住运行前要创建一个叫ADOTest的ODBC数据源。该程式将把表BlockDefine中的BlockIndex字段值显示在列表控件中。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS