ODBC / OLEDB___DAO / RDO / ADO

ODBC / OLEDB___DAO / RDO / ADO

ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。---出现的最早,但不总是万能。是Microsoft引进的一种早期数据库接口技术。它实际上是ADO的前身。

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

DAO(Data Access Objects):数据访问对象是用来显露了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基础上的

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这些应用级的编程接口的升级吧。

----------------------------------------------------------------------------------
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的数据存储对象,能提供对所有类型的数据的操作,甚至能在离线的情况下存取数据(比方说,你使用的是你的便携机,你可以毫不费力地看到最后一次数据同步时的数据映像). 

          这可以看出来,出现的顺序是: ODBC——>DAO——>RDO——>OLEDB——>ADO


OLEDB位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的"应用程序". 你的ADO调用先被送到OLEDB,然后再交由ODBC处理. 你可以直接连接到OLEDB层,如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升. 那我们该如何直接连接到OLEDB呢? 
ODBC-->OLEDB-->ADO-->应用程序
想直接连到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连接串是这样的(用dsn连接的时候): 

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的连接字符串是(用dsn连接的时候): 
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

=================================================================================================

下面这个百度知道里面的,回答的很精彩:

=================================================================================================

ODBC(开放数据库互连):是Microsoft引进的一种早期数据库接口技术。它实际上是ADO的前身。早期的数据库连接是非常困难的. 每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的
底层API有深刻的了解. 因此,能处理各种各样数据库的通用的API就应运而生了. 也就是现在的ODBC(Open Database Connectivity), ODBC是人们在创建通用API的早期产物. 有许多种数据库
遵从了这种标准,被称为ODBC兼容的数据库. OLEDB(对象链接和嵌入数据库):位于ODBC层与应用程序之间. 在你的ASP页面里,ADO是位于OLEDB之上的"应用程序". 你的ADO调用先被送到OLEDB,然后再交由ODBC处理. 你可以直接连接到OLEDB层,
如果你这么做了,你将看到服务器端游标(recordset的缺省的游标,也是最常用的游标)性能的提升. 用odbc连接数据库: 
odbc中提供三种dsn,它们的区别很简单:
用户dsn只能用于本用户。
系统dsn和文件dsn的区别只在于连接信息的存放位置不同:系统dsn存放在odbc储存区里,而文件dsn则放在一个文本文件中。 
它们的创建方法就不说了。
用dsn连接数据库: 
在asp中使用它们时,写法如下: 
A.sql server: 
用系统dsn: connstr="DSN=dsnname; UID=xx; PWD=xxx;DATABASE=dbname" 
用文件dsn: connstr="FILEDSN=xx;UID=xx; PWD=xxx;DATABASE=dbname" 
还可以用连接字符串(从而不用再建立dsn): 
connstr="DRIVER={SQL SERVER};SERVER=servername;UID=xx;PWD=xxx" 
B.access: 
用系统dsn: connstr="DSN=dsnname" 
(或者为:connstr="DSN=dsnname;UID=xx;PWD=xxx") 
用文件dsn: connstr="FILEDSN=xx" 
还可以用连接字符串(从而不用再建立dsn): 
connstr="DRIVER={Microsoft Access Driver};DBQ=d:\abc\abc.mdb" 用oledb连接数据库: 
A.sql server: 
connstr="PROVIDER=SQLOLEDB; DATA SOURCE=servername;UID=xx;PWD=xxx;DATABASE=dbname" 
B.access: 
connstr="PROVICER=MICROSOFT.JET.OLEDB.4.0; DATA SOURCE=c:\abc\abc.mdb"
值得注意的是,OLE DB对ODBC的兼容性,允许OLE DB访问现有的ODBC数据源。其优点很明显,由于ODBC相对OLE DB来说使用得更为普遍,因此可以获得的ODBC驱动程序相应地要比OLE DB的要多。
这样不一定要得到OLE DB的驱动程序,就可以立即访问原有的数据系统。提供者位于OLE DB层,而驱动程序位于ODBC层。如果想使用一个ODBC数据源,需要使用针对ODBC的OLE DB提供者,它会接着
使用相应的ODBC驱动程序。如果不需要使用ODBC数据源,那么可以使用相应的OLE DB提供者,这些通常称为本地提供者(native provider)。可以清楚地看出使用ODBC提供者意味着需要一个额外的
层。因此,当访问相同的数据时,针对ODBC的OLE DB提供者可能会比本地的OLE DB提供者的速度慢一些。
posted on 2011-12-09 00:33 初学者心态 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jinianjun/archive/2011/12/09/2281442.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

waveOutGetDevCaps - 查询输出设备的性能

WinAPI: waveOutGetDevCaps - 查询输出设备的性能//声明: waveOutGetDevCaps(uDeviceID: UINT; {输出设备ID}lpCaps: PWaveOutCaps; {TWaveOutCaps 结构的指针, 用于接受设备信息}uSize: UINT): MMRESULT; {TWaveOutCaps 结构大小} ): MMRESULT; {成功返…

【luogu P5022 旅行】 题解

题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m n - 1 时的树的做法。 读题推一下样例不难发现,如果选择一个分支节点就必须走到头——直到一个节点没有子树。 那么我们就可以…

面向对象编程从骨子里就有问题——看看名人大家是如何吐槽面向对象的

2019独角兽企业重金招聘Python工程师标准>>> 本文由“外刊IT评论”网(www.aqee.net)荣誉出品 “面向对象编程是一个极其糟糕的主意,只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者) “面向对象设计是用罗马数字做计算。” — Ro…

花了两个星期,我终于把 WSGI 整明白了

在 三百六十行,行行转 IT 的现状下,很多来自各行各业的同学,都选择 Python 这门胶水语言做为踏入互联网大门的第一块敲门砖,在这些人里,又有相当大比例的同学选择了 Web 开发这个方向(包括我)。…

如何:通过现有代码创建 C++ 项目

http://msdn.microsoft.com/zh-cn/library/b9cy3d6x(vvs.90).aspx 如何:通过现有代码创建 C 项目 Visual Studio 2008其他版本2(共 2)对本文的评价是有帮助 - 评价此主题更新:2007 年 11 月 可以使用 “从现有代码文件创建新项目”…

JqueryCookie

https://github.com/carhartl/jquery-cookie/downloads转载于:https://www.cnblogs.com/mingyongcheng/archive/2011/12/09/2282613.html

ActiveReports 报表应用教程 (8)---交互式报表之动态过滤

用户可以使用葡萄城ActiveReports报表参数 (Parameters)集合把数据提供给报表中的文本框或图表,也可以选择数据的一个子集显示到报表的特定区域,或者是把数据从主报表象子报表传递。用户可以通过三种方式获取数据的值:提示用户输入&#xff1…

gSOAP学习笔记

网站:http://www.cppblog.com/pansunyou/archive/2013/08/05/137563.html gSOAP学习笔记 虽然SOAP被有些人说太老土,但在银行里仍有大量系统在使用,前段时间在工作中接触到,故记录一下。 gSOAP学习笔记 潘孙友 2010-12-27 于遵义 目录 一、基…

Scala实践6

1 if表达式 Scala中if...else..表达式是有返回值的,如果if和else返回值类型不一样,则返回Any类型。scala> val a310 a3: Int 10scala> val a4 | if(a3>20){ | "a3大于a4" | }else{ | "a4大于a3" | } a4: String a4大于a…

jquery ui autocomplete输入中文不自动完成的问题

因为输入法或浏览器的问题,在输入中文后并没有触发自动完成,要再按多一下键盘才触发,查看发现它是用keydown来实现.bind("keydown.autocomplete", function(event) {....})可以对其input事件进行监听来解决问题,在上面的…

【洛谷p1464】 Function

中考第一天&#xff1b; 感觉我超废&#xff1b; 就是看这道题特别顺眼emmm SOLUTION&#xff1a; 思路的话是开三维数组s[i][j][k]&#xff0c;先三重for循环预处理出s[0~20][0~20][0~20]的w(a,b,c)&#xff0c;然后直接搜索就好了。 Code&#xff1a; #include<bits/stdc.…

一个简单的高并发的回应服务器(5万并发)

一个简单的高并发的回应服务器&#xff0c;主要是使用boost的库&#xff01; 自己测试过可以达到5万个并发&#xff01; 程序的下载地址&#xff1a;http://download.csdn.net/detail/guanyijun123/8335907 #include <stdio.h> //#include "AuthenHandle.h" /…

delphi 的一些备忘

override&#xff1a;覆盖&#xff1b; overload&#xff1a;重载&#xff1b; Reintroduce&#xff1a;重定义&#xff0c;它的引入是为了屏蔽父类的一个虚方法,而在子类中生成一个新的方法; 其实你不使用reintroduce也会覆盖屏蔽父类的方法的但是会产生一个警告&#xff01; …

10.高效分布

ListView默认的分页是先从数据源取得所有数据&#xff0c;然后再截取当前页面的部分&#xff0c;在数据量非常大的情况下效率非常低&#xff0c;因此默认的分布基本不能用。应该是只从数据源取得要显示的数据即可。SQL中语句中取得分页数据的方法为&#xff1a;Select * ,ROW_N…

项目测试~

这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 这个作业要求在哪里 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2/homework/3340 团队名称 求莫名堂 作业的目标 学会进行项目的测试&#xff0c;并通过测试发…

boost_1_48_0 在VS2008下的安装 Boost.Asio安装

第一步&#xff1a;到官网www.boost.org&#xff0c;下载boost最新版boost_1_48_0.zip第二步&#xff1a;将boost压缩包解压到C盘根目录下(在C盘操作简单&#xff0c;不会出错)&#xff0c;目录为C:\BOOST_1_48_0,里面就是boost的源码和需要编译的文件及文档资料第三步&#xf…

线程----BlockingQueue

import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** 本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西…

D3D9 effect (hlsl)(转)

转:http://blog.csdn.net/leonwei/article/details/8212800 effect其实整合了shader和render state的控制两大部分内容 9.1 effect文件基本框架 part1 &#xff1a;shader state包括全局变量 shader数据结构定义&#xff0c;shader的实现 part2 &#xff1a;texture and sample…

boost_1.47在VS2010下的安装

第一步&#xff1a;到官网www.boost.org&#xff0c;下载boost最新版boost_1_47_0.zip第二步&#xff1a;将boost压缩包解压到C盘根目录下(在C盘操作简单&#xff0c;不会出错)&#xff0c;目录为C:\BOOST_1_47_0,里面就是boost的源码和需要编译的文件及文档资料第三步&#xf…

创建 WPF 不规则窗口

创建 WPF 不规则窗口 本文为khler原作&#xff0c;转载必须确保本文完整并完整保留原作者信息及本文原始链接  E-mail: khler163.com  QQ: 23381103  MSN: pragmachotmail.com   相对于用MFC创建不规则窗口&#xff0c;WPF创建不规则窗体的过程就显得相当享受了&…