CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

OLE DB,ADO,ODBC之间有什么区别?

楼主javaflyers(我的问题总是这么经典)2004-12-04 10:59:04 在 MS-SQL Server / 应用实例 提问

还有PROVIDER,连接数据库时,有时需要PROVIDER,有时又不需要?  
   
  有没有相关的文章推荐一下 问题点数:0、回复次数:9Top

1 楼shamihu()回复于 2004-12-04 11:54:43 得分 0

ADO,OLEDB,ODBC,DAO,RDO的区别  
   
  ODBC(Open   Database   Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows   Open   Services   Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。---出现的最早,但不总是万能。  
   
  DAO:数据访问对象是用来显露了Microsoft   Jet数据库引擎(最早是给Microsoft   Access   所使用,现在已经支持其它数据库),并允许开发者通过ODBC直接连接到其他数据库一样,直接连接到   Access   表。DAO   最适用于单系统应用程序或在小范围本地分布使用。其内部已经对Jet数据库的访问进行了加速优化,而且其使用起来也是很方便的。所以如果数据库是Access数据库且是本地使用的话,建议使用这种访问方式---应用的专一性  
   
  RDO(Remote   Data   Objects)远程数据对象是一个到ODBC的、面向对象的数据访问接口,它同易于使用的DAO   style组合在一起,提供了一个接口,形式上展示出所有ODBC的底层功能和灵活性。尽管RDO在很好地访问Jet或ISAM数据库方面受到限制,而且它只能通过现存的ODBC驱动程序来访问关系数据库。但是,RDO已被证明是许多SQL   Server、Oracle   以及其他大型关系数据库开发者经常选用的最佳接口。RDO提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。---无疑是在odbc基础上的  
   
  OLE   DB   是   Microsoft   的一个战略性系统级编程接口,用于管理整个组织内的数据。OLE   DB   是建立在   ODBC   功能之上的一个开放规范。ODBC   是为访问关系型数据库而专门开发的,OLE   DB   则用于访问关系型和非关系型信息源,例如主机   ISAM/VSAM   和层次数据库,电子邮件和文件系统存储,文本、图形和地理数据以及自定义业务对象。    
  OLE   DB   定义了一组   COM   接口,对各种数据库管理系统服务进行封装,并允许创建软件组件,实现这些服务。OLE   DB   组件包括数据提供程序(包含和表现数据)、数据使用者(使用数据)和服务组件(处理和传送数据,例如,查询处理器和游标引擎)。    
  OLE   DB   接口有助于平滑地集成组件,这样,OLE   DB   组件厂商就可以快速地向市场提供高质量   OLE   DB   组件。此外,OLE   DB   包含了一个连接   ODBC   的“桥梁”,对现用的各种   ODBC   关系型数据库驱动程序提供一贯的支持。---号称取代odbc,但也兼容odbc  
   
  ADO(ActiveX   Data   Object)是DAO/RDO的后继产物。ADO   2.0在功能上与RDO更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO"扩展"了DAO和   RDO   所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。   作为最新的数据库访问模式,ADO的使用也是简单易用,所以微软已经明确表示今后把重点放在ADO上,对DAO/RDO不再作升级,所以ADO已经成为了当前数据库开发的主流。   ADO涉及的数据存储有DSN(数据源名称)、ODBC(开放式数据连接)以及OLE   DB三种方式。后面的例程将详细讲解这三种方式的具体访问实现。---可以说是对odbc,oledb这些系统级的编程接口的汇接,并对DAO,RDO这些应用级的编程接口的升级吧。  
   
  Top

2 楼shamihu()回复于 2004-12-04 11:55:17 得分 0

OLEDB的性能比较    
   
  有许多种办法可以连上一个数据库.   你可以用System   DSN,   DSN-less连接或是本地的OLEDB   provider.   OLEDB?   这是什么什么玩艺儿?   也许你们中的许多人以前没有听说过.   要回答这个问题,我们先得回顾一下数据库连接的历史.    
   
  早期的数据库连接是非常困难的.   每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解.   因此,能处理各种各样数据库的通用的API就应运而生了.   也就是现在的ODBC(Open   Database   Connectivity),   ODBC是人们在创建通用API的早期产物.   有许多种数据库遵从了这种标准,被称为ODBC兼容的数据库.    
  ODBC兼容的数据库包括Access,   MS-SQL   Server,   Oracle,   Informix等.    
   
  但ODBC并不是完美无缺的,它仍然含有大量的低级的调用,开发ODBC应用程序仍较困难.   开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据.   后来微软提出了一个解决方案:   DAO(Data   Access   Objects).   DAO的代码看起来象这样:    
   
  objItem.AddNew    
  objItem.Name   =   "Chair"    
  objItem.Price   =   10    
  objItem.Update    
   
  你也许看过DAO的代码.   后来DAO演变为RDO(Remote   Data   Objects,   为分布式数据库体系设计),   再后来是ADO.   尽管它们都有各自的不足之处.   根据微软的说法,"ODBC提供了本地SQL数据的存取,DAO提供了高级的数据对象".   DAO和RDO都需要数据以SQL(Structured   Query   Language)的格式存储.   针对这些缺陷,微软提出了OLEDB,一个基于COM的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像).    
   
  OLEDB位于ODBC层与应用程序之间.   在你的ASP页面里,ADO是位于OLEDB之上的"应用程序".   你的ADO调用先被送到OLEDB,然后再交由ODBC处理.   你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升.   那我们该如何直接连接到OLEDB呢?    
   
  要想直接连到OLEDB层,你必须改变你的connection对象连接字符串.   先用老办法创建一个connectiong对象:    
   
  Dim   objConn    
  Set   objConn   =   Server.CreateObject("ADODB.Connection")    
   
  接下去,我们不用常规的类似DSN=pubs   or   DRIVER={MS   SQL-    
  Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine的连接字符串,而采用下面的连接字符串:    
   
  objConn.ConnectionString   =   "Provider=ProviderName;   Data    
  Source=DatabaseSource;   Initial   Catalog=DatabaseName;   User   ID=UserID;    
  Password=Password"    
   
  对于SQL:    
  ProviderName   =   SQLOLEDB    
  Data   Source   =   Server   Name    
  Initial   Catalog   =   Database   Name    
   
  对于Access:    
  ProviderName   =   Microsoft.Jet.OLEDB.3.51    
  Data   Source   =   Full   path   to   .MDB   file    
   
  下面让我们来看两个例子,一个是针对Access的,还有一个是针对SQL的.   如果你的连接SQL的DSN-less连接串是这样的:    
   
  DRIVER={MS   SQL-Server};UID=sa;PWD=;DATABASE=pubs;SERVER=myMachine    
   
  那么直接连接到OLEDB的连接字符串应该是这样的:    
   
  Provider=SQLOLEDB;   Data   Source=myMachine;   Initial   Catalog=pubs;   User    
  ID=sa;   Password=    
   
  让我们来看看Access,如果你的Access的连接字符串是:    
   
  DRIVER={Microsoft   Access   Driver   (*.mdb)};    
  DBQ=c:\inetpub\wwwroot\users.mdb    
   
  那么直接连接到OLEDB的连接字符串应该是这样的:    
   
  Provider=Microsoft.Jet.OLEDB.3.51;   Data    
  Source=c:\inetpub\wwwroot\users.mdb    
   
  就是这么简单,挺棒的吧?    
   
  这很重要吗?    
  现在你也许对为什么要学习这种新的数据库连接方法感到有些儿迷惑,为什么不走标准的DSN-less/System   DSN路子呢?   让我来告诉你为什么.   据Wrox出的ADO   2.0    
  Programmer's   Reference一书中的测试,用OLEDB连接而不是DSN或DSN-less的连接会得到的性能提升如下:    
   
  性能比较    
  SQL   Access    
   OLEDB   DSN OLEDB   DSN    
  Connection   Times:   18   82   Connection   Times:   62   99    
  Iterating   through   1,000   Records   Times:   2900   5400   Iterating   through    
  1,000   Records   Times:   100   950    
  Top

3 楼microd(重构一切)回复于 2004-12-04 14:47:18 得分 0

又学到不少。。。。tks!Top

4 楼laiyiling(陌生人[MVP])回复于 2004-12-05 08:18:15 得分 0

转帖:         http://www.vccode.com/file_show.php?id=202      
  从功能简单的数据库(如Jet     Engine)到复杂的大型数据库系统(如oracle),VC++6.0都提供了一些编程接口。本文主要介绍以下五种:      
                 1.ODBC     API;      
                 2.MFC     ODBC类;      
                 3.MFC     DAO类;(数据访问对象)      
                 4.MFC的OLE/DB;      
                 5.ActiveX数据对象(ADO)。      
   
  详细的分析看连接里面Top

5 楼wanshunhao(坦克)回复于 2004-12-05 11:03:34 得分 0

一、ADO   和   RDO、DAO   的比较  
   
  ADO   并不是自动和您现存的数据访问应用程序代码兼容的。当   ADO   封装   DAO   和   RDO   的功能性的时候,就必须将许多语言要素转换为   ADO   语法。在某些情况下,您可以将现存代码的某些功能做一个简单转换。在其他情况下,最好是用   ADO   的新功能重写该应用程序。  
   
  DAO   (Data   Access   Objects)   数据访问对象是第一个面向对象的接口,它显露了   Microsoft   Jet   数据库引擎(由   Microsoft   Access   所使用),并允许   Visual   Basic   开发者通过   ODBC   象直接连接到其他数据库一样,直接连接到   Access   表。DAO   最适用于单系统应用程序或小范围本地分布使用。  
   
  RDO   (Remote   Data   Objects)   远程数据对象是一个到   ODBC   的、面向对象的数据访问接口,它同易于使用的   DAO   style组合在一起,提供了一个接口,形式上展示出所有   ODBC   的底层功能和灵活性。尽管   RDO   在很好地访问   Jet   或   ISAM   数据库方面受到限制,而且它只能通过现存的   ODBC   驱动程序来访问关系数据库。但是,RDO   已被证明是许多   SQL   Server、Oracle   以及其他大型关系数据库开发者经常选用的最佳接口。RDO   提供了用来访问存储过程和复杂结果集的更多和更复杂的对象、属性,以及方法。  
   
  ADO   是   DAO/RDO   的后继产物。ADO   2.0在功能上与   RDO   更相似,而且一般来说,在这两种模型之间有一种相似的映射关系。ADO   "扩展"了   DAO   和   RDO   所使用的对象模型,这意味着它包含较少的对象、更多的属性、方法(和参数),以及事件。例如,ADO   没有与   rdoEngine   和   rdoEnvironment   对象相等同的对象,可以显露   ODBC   驱动程序管理器和   hEnv   接口。虽然您的接口可能是通过   ODBC   OLE   DB   服务提供程序实现的,但您当前也不能从   ADO   中创建   ODBC   数据源。  
   
  包含在   DAO   和   RDO   模型中的许多功能被合并为单个对象,这样就生成了一个简单得多的对象模型。然而,由于这个原因,起初您可能会觉得找到合适的   ADO   对象、集合、属性、方法,或事件非常困难。与   DAO   和   RDO不同的是,虽然   ADO   对象是分层结构的,但在分层结构范围之外也是可以创建的。  
   
  不过,也应当注意,ADO   当前并不支持   DAO   的所有功能。ADO   主要包括   RDO   风格的功能性,以便和   OLE   DB   数据源交互,另外还包括远程和   DHTML   技术。  
   
  一般说来,在   ADO   的演化过程中,马上把大多数   DAO   应用程序移植到   ADO   上可能为时太早,因为当前的   ADO   并不支持数据定义   (DDL)、用户、组,等等。不过,如果您只将   DAO   用于客户-服务器应用程序,而并不依赖于   Jet   数据库引擎或不使用   DDL,那么现在就可能移植到   ADO。最终,Microsoft   将提供一个   ADO   DDL   部件来帮助进行   DAO   到   ADO   的移植,并为   OLE   DB   供应商提供一般的   DDL   支持。  
   
   
  Top

6 楼wanshunhao(坦克)回复于 2004-12-05 11:04:04 得分 0

二、ADO   2.0   对象模型  
   
  ADO   2.0   对象模型由八个对象组成的,它们中的大多数在功能上和   RDO   对象相似,只不过具有更强的功能性而已。需要花一些时间在   Object   Browser   (F2)   中浏览对象模型,以便于熟悉各种不同属性、方法、事件、集合等等所在的位置。  
  注意   所有后面带有星号   (*)   的对象都是同时应用于   ADO   Recordset   类型库   (ADOR)   的对象。    
  ·   Command   对象   包含关于某个命令,例如查询字符串、参数定义等的信息。Command   对象在功能上和   RDO   的   rdoQuery   对象是相似的。  
  ·   Connection   对象   包含关于某个数据提供程序的信息。Connection   对象在功能上和   RDO   的   rdoConnection   对象是相似的,并且包含了关于结构描述的信息。它还包含某些   RDOEnvironment   对象的功能,例如   transaction   控件。  
  ·   Error   对象   包含数据提供程序出错时的扩展信息。Error   对象在功能上和   RDO   的   rdoError   对象是相似的。  
  ·   Field   对象*   包含记录集中数据的某单个列的信息。Field   对象在功能上和   RDO   的   rdoColumn   对象是相似的。  
  ·   Parameter   对象   包含参数化的   Command   对象的某单个参数的信息。该   Command   对象有一个包含其所有   Parameter   对象的   Parameters   集合。Parameter   对象在功能上和   RDO   的   rdoParameter   对象是相似的。  
  ·   Property   对象*   包含某个   ADO   对象的提供程序定义的特征。没有任何等同于该对象的   RDO,但   DAO   有一个相似的对象。ADO   对象可以具有两种属性:    
  ·   Built-In   属性:ADO   的"本地"属性。也就是说,任何使用熟悉的   MyObject.Property   语法的新对象都可以立即使用的   ADO   中的属性。Built-in   属性并不在某个对象的   Properties   集合中以   Property   对象的形式出现,因此尽管您可以修改它们的值,您却不能修改它们的特性或将它们删除。  
  ·   Dynamic   属性:ADO   的非本地属性,它们是由下一级数据提供程序定义的。它们出现在合适的   ADO   对象的   Properties   集合中。    
  例如,一个数据提供程序特有的属性可能指明某个   Recordset   对象是支持事务还是支持更新。这些附加的属性在   Recordset   的   Properties   集合中以   Property   对象的形式出现。Dynamic   属性只能用   MyObject.Properties(0)   或   MyObject.Properties("Name")   语法通过集合来引用。不同的数据提供程序可能提供一个或多个特殊的属性,来处理提供程序特有的操作。  
  ·   Recordset   对象*   Recordset   对象包含某个查询返回的记录,以及那些记录中的游标。Recordset   对象在功能上和   RDO   的   rdoResultset   对象相似。您可以在不用显式地打开   Connection   对象的情况下,打开一个   Recordset(例如,执行一个查询)。不过,如果您选择创建一个   Connection   对象,您就可以在同一个连接上打开多个   Recordset   对象。    
   
  Top

7 楼wanshunhao(坦克)回复于 2004-12-05 11:04:38 得分 0

三、一般数据访问的移植  
   
  下面列出了两个基本的数据访问方案,每个方案都在后面的主题中进行了讨论。在每种方案中,都介绍了一种   RDO   解决方案和一种   ADO   解决方案。    
  ·   建立到某个数据库的连接  
  ·   运行一个基本查询  
   
  注意   部分示例引用了某个窗体上的附加控件,例如一个   MSHFlexGrid   控件或   TextBox   控件。为使自己的工程能够正常工作,请把这些控件添加到工程中。  
   
  1。建立到某个数据库的连接  
  1.>   RDO  
  要打开一个连接,必须提供一个带参数的连接字符串。注意当   RDO   要创建一个   rdoQuery   对象时,是不需要连接的,但当最初创建一个   rdoResultset   对象时,则是需要的:  
  Dim   cn   As   New   rdoConnection  
  Dim   cnB   As   New   rdoConnection  
  Const   ConnectionString   =   "uid=myname;pwd=mypw;driver={SQLServer};   _  
  server=myserver;database=pubs;dsn=''"  
  该连接字符串访问一个特定的   SQL   Server,并允许   ODBC   在没有   DSN   的情况下打开一个连接。这是一个带有所有标准参数的典型   ODBC   连接字符串。  
  下一节代码,在窗体的   Load   事件中,建立了游标驱动程序的类型以及登录超时。缺省情况下,RDO   使用   rdUseIfNeeded   游标类型,该类型调用   SQL   Server   上服务器端的游标。下面的示例中指定了   rdUseNone,从而使这种缺省规定不被遵守。rdDriverNoPrompt   标志意味着如果用户ID   和密码不匹配,应用程序将产生一个错误。  
  Private   Sub   Form_Load()  
  With   cn  
  cn.Connect   =   ConnectString  
  cn.LoginTimeout   =   10  
  cn.CursorDriver   =   rdUseNone  
  cn.EstablishConnection   rdDriverNoPrompt  
  End   With  
  第二个连接执行任何客户批处理更新:  
  With   cnB  
  cnB.Connect   =   ConnectString  
  cnB.CursorDriver   =   rdUseClientBatch  
  cnB.EstablishConnection  
  End   With  
  End   Sub  
  当连接操作完成时最后一个事件发生,并且它能够对连接打开时所出现的任何错误进行处理。可以用该事件来测试连接是否正常工作,如果能正常工作,则使任何依赖于打开连接的按钮都成为有效的。  
  Private   Sub   cn_Connect(ByVal   ErrorOccurred   As   Boolean)  
  If   ErrorOccurred   Then  
  MsgBox   "Could   not   open   connection",   vbCritical  
  Else  
  RunOKFrame.Enabled   =   True  
  End   If  
  End   Sub  
  2.>ADO  
  要在   ADO   中建立一个数据库连接,首先创建一组可被   ADODB   对象引用的   ADO   对象。这些对象将在以后用于设置打开连接和generate结果集的特定属性:  
  Dim   cn   As   New   ADODB.Connection  
  Dim   rs   As   New   ADODB.Recordset  
  Dim   cnB   As   New   ADODB.Connection  
  Dim   Qy   As   New   ADODB.Command  
  下一行创建了一个连接字符串,正如您在前一个   RDO   示例中所创建的那样。在两种情况下,您都使用   ODBC   的   "非-DSN"   连接策略以节省时间,并提高性能:  
  Const   ConnectionString   =   "uid=myname;pwd=mypw;driver={SQL   Server};   _  
  server=myserver;database=pubs;dsn=",,connection=adConnectAsync"  
  下面的声明对本示例中用到的变量进行初始化。(注意一个保存结果集的变量数组的创建):  
  Dim   sql   As   String  
  Dim   rc   As   Integer  
  Dim   i   As   Integer  
  Dim   Changes   As   Integer  
  Dim   bms()   As   Variant  
  下一步,打开一个到   Form_Load   事件中某个数据库的   ADO   连接。注意该代码和   RDO   代码是很相似的,只不过常数是以   "ad"   开始的,而不是   "rd"。如果要看到所有可以使用的常数,请查看   ADODB   类型库。  
  注意   不需要指定提示行为,因为   ADO   的缺省设置为"无提示"。不过,如果您选择对之进行更改,则可以使用   ADO   Properties   集合来处理希望的提示行为。在   RDO   中,您可以用   OpenConnection   参数来设置行为。在   ADO   中,您必须设置   Properties   ("Prompt")   属性。  
  同时,如果您不想使用游标驱动程序,则不必对其进行指定(象在   RDO   中的CursorDriver   =   rdUseNone),因为   ADO   的缺省规定是无游标驱动程序。  
  Private   Sub   Form_Load()  
  With   cn  
  '   建立非   DSN   连接  
  .ConnectionString   =   ConnectString  
  .ConnectionTimeout   =   10  
  '.Properties("Prompt")   =   adPromptNever    
  '   This   is   the   default   prompting   mode   in   ADO.  
  .Open  
  End   With  
  With   cnB  
  .ConnectionString   =   ConnectString  
  .CursorLocation   =   adUseClient  
  .Open  
  End   With  
  End   Sub  
  2。运行一个基本查询  
  1.>RDO  
  该事件过程返回一个基于   SQL   语句的结果集。它执行一个受限查询,并将结果集传递到一个控件,该控件将结果数据插入到某个   MSHFlexGrid   控件中。注意,建立结果集需要一个打开的连接。  
  Private   Sub   RunButton_Click()  
  Dim   rs   As   rdoResultset  
  Set   rs   =   cn.OpenResultset("select   *   from   titles   where   title   _  
  like   '%h'")  
  rdoGrid1.ShowData   rs  
  rs.Close  
  End   Sub  
  2.>ADO  
  一旦打开了数据库连接,您就可以对其运行一个查询。下面的事件过程和先前的   RDO   代码是非常相似的。不过,在这种情况下,您用进行   SQL   查询的新   ADO   Open   方法和   ADO   Connection   对象作为参数,而不是使用   rdoConnection   对象的   OpenResultset   方法。您也可以选择使用   ADO   Connection   对象的   Execute   方法,就象您可以在   RDO   中所做的那样(只要它不返回一个行集合)。  
  ADO2   和   RDO2   相比,一个主要的不同之处在于   ADO2   允许您创建一个记录集,并在打开该记录集之前对其属性进行设置。  
  Private   Sub   RunButton_Click()  
  Dim   rs   As   New   ADODB.Recordset  
  rs.Open   "select   *   from   titles   where   title   like   '%h'",   cn  
  ADOGrid1.ShowData   rs  
  rs.Close  
  End   Sub  
  您可以运行该查询,并在   ADO   中异步地处理其结果集。也就是说,you   specify   the   adFetchAsynch   option   on   rs.Open,ADO   导致游标驱动程序自动充填背景中的结果集。  
   
  Top

8 楼didoleo(冷月无声)回复于 2004-12-05 11:44:16 得分 0

哇!收藏了!谢谢Top

9 楼aohan(aohan)回复于 2004-12-05 11:52:11 得分 0

写的不错,我接分了Top

相关问题

  • 急问:ado和odbc有何区别?
  • DAO、RDO、ADO、ODBC有什么区别?
  • 高手赐教,ADO与ODBC的区别
  • odbc和ole-db有什么区别?
  • 请教ODBC ,DAO ,OLE DB的区别
  • Bde,Ado,Dao,Odbc 访问数据库的区别
  • 请问ODBC,ADO,BDE,SQL有什么区别?急,详细讲解
  • 请问ODBC,ADO,BDE,SQL有什么区别?
  • OLE DB连接跟ODBC连接有何区别?
  • OLE DB驱动程序和ODBC驱动程序什么区别?

关键词

  • 数据库
  • ado
  • 属性
  • 连接
  • 接口
  • 数据
  • 相似
  • 应用程序
  • 数据访问
  • 代码

得分解答快速导航

  • 帖主:javaflyers

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo