VisualC++数据库编程快速入门odbc(opendatabaseconnectivity,开放数据库互连)是微软公司开放服务结构(wosa,windowsopenservicesarchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准api(应用程序编程接口)。这些api利用sql来完成其大部分任务。odbc本身也提供了对sql语言的支持,用户可以直接将sql语句送给odbc。一个基于odbc的应用程序对数据库的操作不依赖任何dbms,不直接与dbms打交道,所有的数据库操作由对应的dbms的odbc驱动程序完成。也就是说,不论是foxpro、access还是oracle数据库,均可用odbcapi进行访问。由此可见,odbc的最大优点是能以统一的方式处理所有的数据库。一个完整的odbc由下列几个部件组成:应用程序(application)。odbc管理器(administrator)。该程序位于windows95控制面板(controlpanel)的32位odbc内,其主要任务是管理安装的odbc驱动程序和管理数据源。驱动程序管理器(drivermanager)。驱动程序管理器包含在odbc32.dll中,对用户是透明的。其任务是管理odbc驱动程序,是odbc中最重要的部件。odbcapi。odbc驱动程序。是一些dll,提供了odbc和数据库之间的接口。数据源。数据源包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。各部件之间的关系如图下图所示:应用程序要访问一个数据库,首先必须用odbc管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及odbc驱动程序等信息,建立起odbc与具体数据库的联系。这样,只要应用程序将数据源名提供给odbc,odbc就能建立起与相应数据库的连接。在odbc中,odbcapi不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对odbcapi的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。在访问odbc数据源时需要odbc驱动程序的支持。用visualc++5.0安装程序可以安装sqlserver、access、paradox、dbase、foxpro、excel、oracle和microsofttext等驱动程序.在缺省情况下,vc5.0只会安装sqlserver、access、foxpro和dbase的驱动程序.如果用户需要安装别的驱动程序,则需要重新运行vc5.0的安装程序并选择所需的驱动程序。1ado是微软整个com战略体系中的一个组成部分活动数据对象(ado)是一组由微软提供的com组件。ado建立在微软所提倡的com体系结构之上,它的所有接口都是自动化接口,因此在c++、visualbasic、delphi等支持com的开发语言中通过接口都可以访问到ado。ado通过使用oledb这一新技术实现了以相同方式可以访问关系数据库、文本文件、非关系数据库、索引服务器和活跃目录服务等的数据,扩大了应用程序中可使用的数据源范围,从而成为微软整个com战略体系中访问数据源组件的首选,是odbc的替代产品。2ado对象模型组成与微软的其它数据访问模型dao和rdo相比,ado对象模型非常精炼,仅由三个主要对象connection、command、recordset和几个辅助对象组成,其相互关系如图所示。connection对象提供oledb数据源和对话对象之间的关联,它通过用户名称和口令来处理用户身份的鉴别,并提供事务处理的支持;它还提供执行方法,从而简化数据源的连接和数据检索的进程。command对象封装了数据源可以解释的命令,该命令可以是sql命令、存储过程或底层数据源可以理解的任何内容。recordset用于表示从数据源中返回的表格数据,它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法,还提供了批量更新记录的能力。其它辅助对象则分别提供封装ado错误、封装命令参数和封装记录集合的列。3ado的特点分析(1)由于封装了许多底层工作,使用ado与使用odbc几乎是一样方便。(2)ado不仅具有odbc的主要功能,而且ado适用的数据源的范围要大的多。(3)在定义ado记录集变量和数据库表字段绑定类时,要求记录集的字段变量、状态变量与数据库表字段的个数、顺序必须相同。这一点比在fmc中使用odbc要复杂一些。但在数据库字段与ado记录集字段变量绑定的宏中,ado提供的数据类型要远多于fmc中的rfx(如日期时间类型,在odbc中只能转换为cstring类型)。(4)ado允许同一connection实例下有多个recordset实例。(5)ado允许进行批更新(使用的updatebatch方法),这样将大大减轻网络负担,提高数据库处理效率。4ado在visualc++中的使用close();(12)调用counitialize释放com资源::couninitialize();5结论作为odbc的替代产品,ado确实有其过人之处。由于ado数据源几乎覆盖了目前常见的数据源类型,对于odbc所不支持的数据源,ado无疑是唯一的选择。而ado的批更新功能,更是网络环境下大数据量更新应用的重要因素。由于ado缺乏大量的第三方厂商的支持,使得ado目前远不如odbc普及,但其面向对象的特性将使ado具有比较广阔的发展前景。有很多种使用数据库的方法,对大多数数据库来说,选择c++这种产品也许并不适宜。我们知道,像dbaseiv,foxpro,oracle和access这样的产品是完全以数据库管理为中心的。事实上,这些产品非常善于创建数据库管理器,以至于它们确实并不善于做太多其它的工作。即使要用更通用化而非更专用化的数据库产品来执行一些类型的工作,在使程序设计更容易这一方面,像visualbasic和delphi这样的rad环境也要比visualc++强很多。你是不是对我的说法感到很奇怪?下面我就要谈一谈,在谈到使用数据库管理系统(dbms)这个话题时,用visualc++实际上可以做些什么。虽然上述其它语言使得编写成熟的包括用户界面和高速搜索能力的dbms就像孩子做游戏一样容易,但是,它们缺少visualc++可以提供的某些重要东西。你不能为使用access的数据库轻松地编写出实用程序。正像实用程序的定义所说的,实用程序应该很小并且具备可移植性——access应用程序却不是这样。即使用access这样的产品创建的程序可以很小并且可以移植,你仍有其它方面的需求:底层的功能。注:编写数据库实用程序及驱动程序时,可以选择visualc++语言。想像一下,使用像visualbasic这样的语言来与实时数据采集设备打交道的情况。在进行底层访问时,rad的保护环境常常使程序员不能进行有效的处理。当然,数据采集设备几乎不依赖于简明的连接。你打算如何把visualbasic和外部的数据源连接起来呢?数据源甚至可能不了解windows,dos或类似的成熟的操作系统。只要使用得当,很容易看到visualc++是一种不可或缺的数据库管理工具。针对大规模的应用程序,即使你仍想依赖于visualbasic这样的rad语言,也请考虑一下visualc++,它创建的程序规模小、提供底层访问并能提供实时访问。事实上,你可能还没有想到,visualc++数据库应用程序的市场是很有潜力的。随着人们在旅途中越来越多地使用膝上型和掌上型电脑,这两类电脑上的数据库应用程序也变得越来越普通。你也许能够适应今天的膝上型电脑上的access应用程序,但谈到硬盘大小或内存需求时,公司里较老的膝上型电脑可能就达不到要求。运行windowsce的掌上型电脑在运行这个access应用程序时,肯定会发生故障。在这一数据库市场的新领域,visualc++提供了无价无限的工具。web链接谈到使用visualc++和数据库,其实你并不孤单。从一开始就有数据库专用新闻组提供有关数据库创建技巧的帮助,比如microsoft.public.access。不过,这些新闻组提供的是通用信息,对实际编写应用程序并非全都那么有用。专门针对visualc++问题的新闻组是microsoft.public.vc.database和microsoft.public.vc.mfcdatabase。如果你决定用odbc访问数据库,可能还要查看一下microsoft.public.odbc.sdk新闻组,它讨论的不仅仅是sdk。对最新技术感兴趣的程序员可以查阅microsoft.public.ado新闻组,或者microsoft.public.oledb(对象链接和嵌入数据库)新闻组,前者讨论ado,后者讨论ado的基础技术。在microsoft.public.ado.rds有一个ado子组,它讨论远程数据访问。既然所有的疑惑都消除了,大多数人的信心也就增强了,下面我们就介绍两种使c++访问数据库中的数据的主要方法:odbc(开放数据库互连)和ado(activex数据对象)。在本章中,将介绍这两种类型的访问方法,但我想你会发现,ado方法是针对新的程序设计情形而采用的。它克服了早期技术的诸多限制,依赖于microsoft新的底层访问方法ole-db(对象链接和嵌入数据库)。在本书的后面我们会看到,用ado和visualc++提供的各种向导来汇集数据库工程,其速度有多快。注odbc通常用来访问不具备ole-db特性的非microsoft数据库中的数据;16位的odbc驱动程序工作起来可能非常缓慢。odbc素以最慢的数据访问方法而著称,但是很可惜,当ado或dao都不支持某个数据库管理器而odbc支持这个数据库管理器时,在这种特定的情形下,你仍然需要使用odbc。在大多数情况下,这意味着要从数据库厂商那里获得所需的驱动程序,虽然visualc++确实附带了一些产品的驱动程序(如果你正在使用数据库管理器的某些神秘功能,那么就需要建立自己的接口棗这并不是一件十分困难的事)。本质上讲,你总是要使用odbc来访问microsoft产品之外的其它dbms产品所创建的数据库,这些数据库并不具备ole-db功能。odbc还要求做一些额外的工作棗为ado调整visualc++中的大部分向导。高级技巧除了使用ado和odbc外,你还可以使用像dao(数据访问对象)这样的早期技术,该技术包含在像access这样的microsoft产品中。dao依赖于用microsoftaccess自动获得的microsoftjet数据库引擎。dao还是较早版的visualbasic所使用的引擎(最新版的visualbasic和visualc++依赖于相同的ado/ole-db组合),所以如果需要支持较早的visualbasic应用程序,那么dao仍是一个不错的选择。尽管microsoft文件声明,可以用dao访问非microsoft产品建立的数据库,但你仍会发现,在这种情况下,使用ado和odbc要好得多。这样的话,不但兼容性问题会少一些,速度也将有所提高,因为数据请求经过的接口层减少了。有一条经验要记住,dao是设计用来处理mdb文件的。ado的一个问题是,它不支持远程通信。这是microsoft提出rdo(远程数据对象)的原因之一。这种特别技术在visualbasic应用程序中的使用,要比在visualc++中的使用多得多,所以我猜想,你们中有很多人都在使用它。但是,记住rdo仍是一种生命力很强的技术,这一点很重要。ado确实具有替代rdo的远程数据服务(rds)特征。换言之,ado在一个软件包中提供了dao和rdo两种功能性。一般情况下appwizard会在数据库应用程序中自动产生crecordset的派生类,并将派生类和某个数据源中的表联系起来也可以和视图上的子窗口联系起来。但是有时这样做会影响到程序的灵活性,这时候我们可