OLE DB和ODBC数据源有什么区别?

195
我正在阅读一篇有关 Excel 的帮助文章,其中提到了“OLE DB 和 ODBC 数据源”,我想知道它们的含义。
引用部分指出,“CommandText 属性应该用于替代 SQL 属性,后者仅为了与 Microsoft Excel 的早期版本兼容而存在。如果同时使用这两个属性,则 CommandText 属性的值优先。”
对于 OLE DB 数据源,CommandType 属性描述了 CommandText 属性的值。
对于 ODBC 数据源,CommandText 属性的功能与 SQL 属性完全相同,并且设置该属性会导致数据刷新...
非常感谢您的简短回答。

2
仅作为一则附注,根据《使用Microsoft SQL Server 2012实现数据仓库》一书的说法:“微软已经宣布,在不久的将来,将取消对OLE DB连接的支持,转而支持ODBC连接。” - B. Burgdorf
3
自2017年10月6日起,它已经取消弃用。请参见https://blogs.msdn.microsoft.com/sqlnativeclient/2017/10/06/announcing-the-new-release-of-ole-db-driver-for-sql-server/。 - Bogey Jammer
11个回答

166
根据Jason T. Roff在2001年由O'Reilly Media出版的书《ADO:ActiveX Data Objects》(此处有优秀的图表),他准确地表达了MOZILLA的观点。
(直接摘自该书第7页)
ODBC仅提供对关系数据库的访问。
OLE DB提供以下功能:
- 访问任何格式或位置的数据 - 完全访问ODBC数据源和ODBC驱动程序
因此,看起来OLE DB通过ODBC驱动程序层与基于SQL的数据源进行交互。

alt text

我不确定这张图片是否正确。 我不确定的两个连接是ADO.NET通过ADO C-api,以及OLE DB通过ODBC到基于SQL的数据源(因为在这张图中,作者没有将OLE DB的访问通过ODBC,我认为这是一个错误)。


7
如果OLE DB使用ODBC连接到SQL数据源,那么任何被OLE DB支持的SQL数据源也必须得到ODBC的支持,但事实并非如此——原始图表必须是正确的(而不是这个新的图表)。 - Danny Varod
8
有时候,OLE DB会包装ODBC驱动程序,有时候则不会。详见这里 - bobobobo
3
这篇文章 http://jamesmccaffrey.wordpress.com/2006/05/02/odbc-vs-ole-db/ 表示在SQL DS中,OLEDB是通过ODBC来进行操作的。 - Hernán
1
@DannyVarod 哦,不用管了。我忽略了“任何由OLE DB支持的SQL数据源”中的关键限定词。我是在谈论一个事实,即由于OLE DB支持非关系型数据库(non-RDBMS)数据源,完全有可能由OLE DB支持的数据源集合无过滤地成为ODBC支持的数据源集合的超集。 - Asad Saeeduddin
4
ADO.NET不包装ADO。 ADO.NET类通常直接与其数据库或数据库网络库进行交互,而不是通过任何其他提供程序/驱动程序层进行交互。例如,System.Data.SqlClient在托管代码中处理TDS协议,仅使用本地代码处理网络传输的TCP/Named Pipes等。对于没有自己的托管提供程序的数据库,您可以使用System.Data.OleDb来包装OLE DB或System.Data.Odbc来包装ODBC,但不建议这样做。 - Mike Dimmick
显示剩余4条评论

60

ODBC:仅适用于关系型数据库 (如 Sql Server、Oracle 等)

OLE DB:既适用于关系型数据库也适用于非关系型数据库。 (Oracle、Sql-Server、Excel、原始文件等)


4
错了,这两种数据库都可以通过相应的驱动程序与非关系型存储交互。 - Andy Dent
1
不,使用ODBC你可以查询平面的CSV文件,而不仅仅是关系型数据库。 - Wernfried Domscheit
错误!还有文本文件和XML ODBC驱动程序。 - Scott Chu
1
我认为这不正确... 开放数据库互连(ODBC)是微软用于访问关系型和非关系型数据库管理系统的异构环境的战略接口。https://support.microsoft.com/en-us/kb/110093 - uzay95
16
哈哈,你们这些人在谈论ODBC是2009年还是2016年的吗?那时候是正确的。 - Yousha Aleayoub

45

这是我的理解(非权威性):

ODBC是一个技术无关的开放标准,由大多数软件供应商支持。OLEDB是一种技术特定的Microsoft API,来自COM时代(COM是.NET之前的组件和互操作技术)。

在某个时刻,各种数据源供应商(例如Oracle等),希望与Microsoft数据消费者兼容,为其产品开发了OLEDB提供程序,但在大多数情况下,OLEDB仍然是Microsoft的专有标准。现在,大多数Microsoft数据源都允许使用ODBC和OLEDB访问,主要是为了与传统的ODBC数据消费者兼容。此外,还存在OLEDB提供程序(包装器)用于ODBC,可以让人们通过OLEDB访问ODBC数据源。

就功能而言,OLEDB比ODBC更加丰富,但存在“一环控制一切”综合症(过于通用、过于复杂、没有明确意见)。

在非Microsoft的世界中,基于ODBC的数据提供程序和客户端被广泛使用,并且不会消失。

在Microsoft内部,OLEDB正在逐步淘汰,取而代之的是基于该数据源的本机.NET API(例如MS SQL Server的TDS)。


33

ODBC和OLE DB是两种竞争的数据访问技术。具体涉及到SQL Server,Microsoft已经在不同的时间推广了它们作为他们首选的未来方向。

ODBC

ODBC是用于访问表格数据的行业标准接口。它主要是为数据库开发的,并将数据呈现为记录的集合,每个记录都分成一组字段。每个字段都有自己的数据类型,适合于其包含的数据类型。每个数据库供应商(Microsoft、Oracle、Postgres等)都会提供其数据库的ODBC驱动程序。

还有一些针对对象的ODBC驱动程序,虽然它们不是数据库表,但它们足够相似,以便以相同的方式访问数据。例如电子表格、CSV文件和列报告。

OLE DB

OLE DB是Microsoft用于访问数据的一项技术。与ODBC不同,它涵盖了类似于表格的和非表格的数据,如电子邮件消息、网页、Word文档和文件目录。但是,它是面向过程而不是面向对象的,被认为是一个相当困难的接口,用它来开发数据源访问。为了克服这一点,ADO被设计成OLE DB上面的面向对象层,并提供了一种更简单、更高级的方法来处理它,虽然仍然非常强大。ADO的优点在于,您可以使用它来操作特定于给定类型数据源的属性,就像您可以使用它访问适用于所有数据源类型的属性一样。您不受限于某些不令人满意的最低公共因数。

虽然所有数据库都有ODBC驱动程序,但并不是所有数据库都有OLE DB驱动程序。但是,OLE和ODBC之间有一个接口可用于以类似OLE DB的方式访问它们。这个接口称为MSDASQL(Microsoft OLE DB提供程序对于ODBC)。

SQL Server数据访问技术

由于SQL Server是(1)由Microsoft制作,并且(2)是Microsoft数据库平台,因此ODBC和OLE DB都非常适合它。

ODBC

由于所有其他数据库平台都有ODBC接口,Microsoft显然必须为SQL Server提供一个接口。除此之外,DAO,Microsoft Access中的原始默认技术,使用ODBC作为与所有外部数据源交互的标准方式。这使得ODBC接口成为必需品。 SQL Server 2000随附的版本6 ODBC驱动程序仍然存在。已发布更新版本以处理随后发布的新数据类型、连接技术、加密、HA/DR等。截至2018年9月7日,最新版本是于2018年3月23日发布的v13.1“ODBC Driver for SQL Server”。

OLE DB

这是Microsoft自己的技术,他们从2002年到2005年一直在积极推广它,同时推出了其附带的ADO层。他们显然希望它成为首选的数据访问技术。(他们甚至将ADO作为Access 2002/2003中访问数据的默认方法。)然而,由于许多原因,例如:

  1. 世界不会转向微软技术,远离ODBC;
  2. DAO/ODBC比ADO/OLE DB更快,并且完全集成到MS Access中,因此不会自然消亡;
  3. 微软正在开发的新技术,特别是ADO.NET,也可以直接与ODBC通信。 ADO.NET也可以直接与OLE DB通信(从而使ADO处于后台),但它不像ADO那样仅依赖于它。

出于这些原因和其他原因, 微软实际上已将OLE DB作为数据访问技术进行了弃用,用于SQL Server v11(SQL Server 2012)之后的版本。在此之前的几年中,他们一直在生产和更新SQL Server Native Client,该客户端支持ODBC和OLE DB技术。然而,2012年底,他们宣布将与ODBC对齐,以便在SQL Server中进行本地关系数据访问,并鼓励其他人也这样做。他们进一步声明,SQL Server v11 / SQL Server 2012之后的版本将积极地支持OLE DB!

这一声明引起了一场抗议风暴。人们不知道为什么微软突然弃用了一项他们花费多年时间才让人们承诺的技术。此外,SSAS/SSRS和SSIS是与SQL Server密切相关的由微软编写的应用程序,它们完全或部分依赖于OLE DB。还有一个抱怨是,OLE DB具有某些理想特性,似乎不可能将其移植回ODBC - 毕竟,OLE DB有很多优点。
2017年10月,微软放弃了之前的决定,正式取消了对OLE DB的废弃。他们宣布即将推出一个新驱动程序(MSOLEDBSQL),该驱动程序将具有现有的Native Client 11功能集,并引入多子网故障转移和TLS 1.2支持。该驱动程序于2018年3月发布。

@ChieltenBrinke 我从几个来源拼凑了这篇文章,比如我已经更新到帖子中的链接和它们引发的评论。其他来源包括Jason Roff关于ADO的书籍,由bobobobo提到,以及Litwin、Getz和Gunderloy的《Access 2002桌面开发者手册》(非常老,但是真正的经典)。我没有任何微软内部消息,所以我对他们各种方向变化背后的思考的猜测虽然合理,但完全是我自己的看法。 - marktwo

10

7
在非常基本的层面上,这些只是不同数据源(即数据库)的不同API。OLE DB更加新颖,也可以说更好。
你可以在维基百科上了解更多信息:
  1. OLE DB
  2. ODBC
也就是说,你可以使用ODBC驱动程序或OLE DB驱动程序连接到同一个数据库。这些情况下数据库行为的差异就是你的书所提到的。

6
就像许多与IT相关的主题一样,事情几乎已经来了个整整的圆。SQL 2012是最后一个支持OLE DB本机提供程序的版本,应用程序现在应该切换回ODBC。就像SQL Server的“古老时代”一样。http://technet.microsoft.com/en-us/library/hh967418.aspx - Chris Wood
6
"OLE DB是较新且可能更好的技术",尽管2008年这可能是正确的,但在2014年已不再如此。 - Michael David Watson
@MichaelDavidWatson 那么你会说,更好使用ODBC还是OLEDB呢?我需要支持尽可能多的不同SQL数据库。正如它所指出的那样,OLE DB也可以访问ODBC数据源。那么为什么你会说“OLE DB是更新且更好”的说法在2015年仍然不正确呢? :) - LuckyLikey
@LuckyLikey 微软已经弃用了OLEDB,SQL Server也不再支持它(SS 2012是最后一个支持它的版本)。https://msdn.microsoft.com/zh-cn/library/hh967418.aspx - Robino

5

两者都是数据提供程序(你的代码用来与数据源通信的API)。Oledb是在1998年推出的,旨在代替在1992年推出的ODBC。


3
我不确定所有细节,但我的理解是OLE DB和ODBC是两个API,可用于连接各种类型的数据库而无需处理每个数据库实现的特定细节。根据《OLE DB的维基百科文章》,OLE DB是微软继ODBC之后推出的产品,并提供了一些ODBC无法实现的功能,例如把电子表格作为数据库来源进行访问。

2

在微软网站上,显示本机OLEDB提供程序直接应用于SQL服务器,而另一个名为ODBC的OLEDB提供程序用于访问其他数据库,例如Sysbase、DB2等。OLEDB提供程序下有不同种类的组件。更多信息请参见MSDN上的分布式查询


0

ODBC仅适用于关系型数据库,无法与非关系型数据库(如Ms Excel文件)配合使用。而Olebd可以做任何事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接