ODBC、OLEDB和ADO之间的关系 ,以及性能比较
学习了.net视频之后,对里面涉及到的数据库连接部分中的一些概念表示很无语。网上很多相关资料,但除了网站不一样外,基本上内容都神一样的一致。
现在,我就通过结合看到的一些资料再加上自己的理解试图去解释一下,有不对的,还请大家指教!
看一张图:
看图中右半部分,我们先来了解一下ODBC这个概念。
1.ODBC:
要了解ODBC是什么,先了解一下数据库连接的相关知识。其实,在最开始连接数据库时,由于数据库种类繁多,各种数据库连接有不同的需求,这个时期,数据库连接主要依靠各种API函数来进行连接。而ODBC就是将这些API函数封装起来形成统一的接口如上图所示(ODBC上方有一个唯一的接口)。图中所示的ODBC层代表ODBC中各种数据库的驱动器(driver),当SQL语句进入接口后,驱动器管理程序通过辨别将它们分别对应的进入各自的驱动器(driver),由驱动器来讲SQL语句送入各种不同的数据库。
不知道上面这样写,有没有把这个ODBC给介绍的明白一点儿,学习要生活化,这样才容易理解。我来举个例子。
我们把ODBC假想成一辆汽车,汽车中有一名司机(driver),把下面的各种数据库假设程不同的工厂。如果司机接收到接口中的命令(SQL语句)——将汽车上的货物运到某个工厂中。那么司机(driver)会根据命令中所指明的货物的类型,自己去辨别到底应该进入哪个工厂才能完成任务。
大家看,上面这个例子中接收的命令就好像是数据库中的SQL语句,那么司机就好像是驱动器(driver),而不同的工厂就好像是不同种类的数据库。这样理解,有没有简单一点儿呢?
2.OLEDB与ODBC
好了,再来看一下OLEDB,在上面的例子中我们理解了ODBC,还有我们必须知道,ODBC负责的只是结构化数据库的连接。这样我们就会比较容易理解OLEDB。
OLEDB其实和ODBC类似,都是负责数据库连接的低级接口。而OLEDB不仅支持结构化数据库如SQL server,Oracel Access等,而且还支持非结构化数据源的连接如EXCEL等。
OLEDB(对象连接和嵌入数据库),是一组对象的集合,一种读写数据的方法。在使用OLEDB时,使用步骤为:初始化OLE、连接到数据源、发出命令、处理结果、释放数据源对象并停止初始化OLE。他可以通过ODBC连接到数据库,也可以之间连接到数据库。当不通过ODBC时,这时在这其中并不涉及到驱动器的成分,因此,此时的数据库连接速度会更快。同时,我们可以知道,只要支持ODBC的数据源是一定能够支持OLEDB的。但是反过来则不一定。
3.ADO
通过图中,我们看到ADO是位于应用程序和OLEDB之间的。它属于数据库连接中的高层接口。
是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。
如何理解上面这个概念呢?其实我们可以联系我们学到的关于ADO控件的相关知识。在原来学习VB的时候,我们如果想要连接到数据库的话,必须加载一个引用空间,里面含有connection,command,recordset等一些相关数据库连接的对象,其实这个引用就是ADO。我们通过这些对象建立对数据库的连接,我们只需编写访问数据库的代码,而并不用关系数据库是如何实现的。
看完了三者的关系,让我们来看看他们操作数据的速度如何,以打开access为例
性能对比:
sql access
oledb dsn oledb dsn
时间 18 82 62 99
查询1,000条记录: 100 150 2900 5400
显然,oledb链接方式相对于dsn有很大的优势.购买虚拟主机的小站,大多是php+mysql或者asp+access的组合,一般没有dsn数据源的配置,而且我们也不需要.同时mssql是一种昂贵的数据库,如果使用效率低下的access,我们应该尽量的减少数据库引擎的压力.我经常看见一些站点给出提示:数据库连接失败,显然,又是access出毛病了.
常用的连接access的办法:
oledb
openstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
odbc
openstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)
这两者在性能上也有一定的差别.下面是一个测试文件,对两者进行比较.
<%
dim openmode,action,db,openstr,rs,conn
openmode=request.QueryString("openmode")
action=request.QueryString("action")
db="#niceidea.mdb"
set conn=server.createobject("adodb.connection")
if penmode="oledb" then penstr="provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
if penmode="odbc" then penstr="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &Server.Mappath(db)
Dim strStartTime
Dim strEndTime
strStartTime = Timer ''''''''''''''''''''''''''''''''开始时间
''''''''''''''''''''''''''''''''反复打开数据库50次
if action="open" then
for i=1 to 50
conn.open(openstr)
conn.close
next
set conn=nothing
end if
''''''''''''''''''''''''''''''''移动记录集10000次
if action="move" then
conn.open(openstr)
set rs=conn.execute("select * from visitor")
for i=1 to 10000
rs.movenext
next
rs.close
set rs=nothing
conn.close
set conn=nothing
end if
''''''''''''''''''''''''''''''''反复打开记录集1000次
if action="getrs" then
conn.open(openstr)
set rs=server.CreateObject("adodb.recordset")
dim sqlstr
sqlstr="select * from visitor"
for i=1 to 1000
rs.open sqlstr,conn,1,1
rs.close
next
set rs=nothing
conn.close
set conn=nothing
end if
%>
<%
'''''''''''''''''''''''''''''''' 加载完毕的时间
strEndTime = Timer
Response.Write ("运行处理时间: ")
Response.Write 1000*(strEndTime - strStartTime)
Response.Write (" 毫秒.")
response.end
%>
得到的数据如下:
odbc反复打开数据库50次:
6062.5 毫秒.
oledb反复打开数据库50次:
4601.563毫秒.
odbc移动记录集10000次:
1132.813 毫秒.
oledb移动记录集10000次:
304.6875 毫秒.
odbc反复打开记录集1000次:
8734.375 毫秒.
oledb反复打开记录集1000次:
7960.938 毫秒.
测试环境,ce1.70/512m/windows xp sp2/withnetbox(不再开发的测试服务器)
显然,在效率上,oledb有些微的优势。微软已经不更新ODBC,用JET方式连接数据库是一种更有效率的办法,特别是在需要移动游标的时候.另外,两者还有一些其他方面的区别,oledb是一种更底层的方法,在这种数据库连接方式中,应该注意的规范更多,就像用sql和access时候,某些查询语句也会不一样.例如:
select from user where id=1
将是一句错误的查询语句,因为user是系统保留的关键字.需要改为
select from [user] where id=1
如果使用odbc连接,则不存在上述情况.
如果使用jet连接,在某些虚拟主机中可能会因为access版本的不同而导致连接失败;所以你需要首先确定主机的引擎版本;在尽可能的情况下,使用以下语句打开access,将提高asp的效率,还有稳定性:
"provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath(db)
此外,打开数据库和记录集对象都是很消耗cpu资源的,尽可能减少查询是很必要的
ODBC、OLEDB和ADO之间的关系 ,以及性能比较的更多相关文章
- 数据库访问接口(ODBC,OLEDB,ADO)
数据库访问接口发展历史 ODBC历史 ODBC(Open Database Connectivity,开放数据库互连).要了解ODBC是什么,先了解一下数据库连接的相关知识.在最开始连接数据库时,由于 ...
- [转帖]ODBC、OLEDB、ADO、ADO.NET
一文详解ODBC.OLEDB.ADO.ADO.NET之间的关系 2019年01月16日 21:28:38 LoveMIss-Y 阅读数:66更多 所属专栏: 白话C#高级编程 版权声明:本文为博主 ...
- .NET世界各成员之间的关系
相信看到这篇文章的人,心中肯定有这样的想法:ODBC.OLEDB.ADO.ADO.NET貌似都是访问数据库的东东,那么他们之间有什么区别,又有什么联系呢?不要着急,待我慢慢道来. 先说ODBC,官方的 ...
- ODBC、OLEDB、ADO、SQL的关系
对于一个刚接触数据库的菜鸟来说(比如我),总是搞不清SQL.ADO.OLE DB.ODBC,大脑中一片混乱,好像懂了,又好像没懂,非常的苦恼,今天下了点功夫研究了一下,贴出来,其中肯定有好多错误,希望 ...
- 【转载】ODBC, OLEDB, ADO, ADO.Net的演化简史
原文:ODBC, OLEDB, ADO, ADO.Net的演化简史 1.演变历史 它们是按照这个时间先后的顺序逐步出现的,史前->ODBC->OLEDB->ADO->ADO.N ...
- ODBC, OLEDB, ADO, ADO.Net的演化简史
ODBC, OLEDB, ADO, ADO.Net的演化简史 Copy&Paste了一下午,终于一蹴而就此文,嘿嘿... 1.演变历史 它们是按照这个时间先后的顺序逐步出现的,史前->O ...
- SQL那些事儿(十一)--ODBC,OLE-DB,ADO.NET区别[转]
一.ODBC ODBC的由来 1992年Microsoft和Sybase.Digital共同制定了ODBC标准接口,以单一的ODBC API来存取各种不同的数据库.随后ODBC便获得了许多数据库厂 ...
- ODBC, OLEDB, ADO, ADO.NET
在SSIS中,选择Connction Manager时,有很多的类型.其中会发现如下4个连接类型ODBC, OLEDB, ADO, ADO.NET.这4个东东到底是什么,他们有什么关联,什么区别,如何 ...
- Python3 freetds.conf odbcinst.ini odbc.ini 之间的关系
Python3 freetds.conf odbcinst.ini odbc.ini 之间的关系 三者分别是FreeTDS和UnixODBC的配置文件: 1,FreeTDS中的freetds.conf ...
随机推荐
- 法国:5G网络不会排除任何设备厂商
腾讯科技讯,据国外媒体报道,法国财政部长布鲁诺·勒梅尔(Bruno Le Maire)日前表示,法国有关 5G 电信网络的决定将基于网络的安全和性能,他强调说,法国政府不会将某一个特定的厂商排除在法国 ...
- maven集成SSM项目,jetty部署运行——搭建maven项目部署jetty试运行(一)
今天闲来没事采用maven集成一个SSM框架来复习复习,下面开始我的复习之旅,慢慢来,不着急,哈哈,不忙时候敲两下,整起来. 工具为Eclipse,首先需要建立一个maven工程,file右键new- ...
- SQL语句--分组统计
一.教师号 星期号 是否有课1 2 有1 3 有2 1 有3 2 有`1 2 有写一条sql语句让你变为这样的表教师号 星期一 星期二 星期三1 2 12 13 1各星期下的数字表示:对应的教师在星期 ...
- 一百零二、SAP中ALV事件之十五,让ALV表格自动求和
一.代码如下 二.运行之后,效果如图,表头多了一个求和符号E,最下面一行会列出求和的相关信息 完美
- 第二阶段scrum-8
1.整个团队的任务量: 2.任务看板: 会议照片: 产品状态: 消息收发制作中
- Maven的安装和创建项目的过程
一.下载Maven包和配置环境变量 1.将下载好的maven包放到一个目录中:目录中不能有汉字和空格 2.配置环境变量 3.配置path路径 二.配置阿里云私服 1.找到setting目录,配置下载j ...
- Python 内置类型 dict, list,线程安全吗
近段时间发现一个 Python 连接数据库的连接是线程不安全的,结果惹得我哪哪儿都怀疑变量的多线程是否安全的问题,今天终于找到了正确答案,那就是 Python 内置类型 dict,list ,tupl ...
- NSPredicate实现数据筛选
一:基本语法 1.什么是NSPredicate apple官方文档这样写的: The NSPredicate class is used to define logical conditions us ...
- 前端ajax用post方式提交json数据给后端时,网络报错 415
项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource ...
- 中国移动携手华为百度展示5G应用,实现8K视频传输
在今日举行的 2019 年百度云智峰会上,中国移动携手华为和百度,首次展示基于 SA 架构的 5G Vertical LAN (行业局域网)技术,承载 8K 实时会议系统,助力企业云办公.该技术可为合 ...