搜索
您的当前位置:首页vb对象DAO与ADO区别

vb对象DAO与ADO区别

来源:飒榕旅游知识分享网
vb对象DAO与ADO区别

Visual Basic 2009-11-30 22:04:19 阅读64 评论0 字号:大中小 订阅

ADO(ACTIVEX DATA OBJECTS)应用层的数据访问接口 ODBC 数据库驱动接口 OLE DB 系统级数据访问接口

DAO (DATA ACCESS OBJECTS) 对象的数据访问接口

ADO是基于全新的OLE DB技术而设计的.是一种基于应用程序层的数据访问接口.它是DAO/RDO的后继产物. DAO是VB最先采用的面向对象的数据访问接口,通过DAO访问MICROSOFT JET数据库引擎. ADODC是封装ADO的VB数据控件,可减少代码编写. ADODB是数据对象,操作数据库需通过编写代码 来实现.

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 应用程序(except possibly是那些使用 ODBCDirect 的应用程序)移植到 ADO 上可能为时太早,因为当前的 ADO 并不支持数据定义 (DDL)、用户、组,等等。不过,如果您只将 DAO 用于客户—服务器应用程序,而并不依赖于 Jet 数据库引擎或不使用 DDL,那么您现在就可能移植到 ADO。最终,Microsoft 将提供一个 ADO DDL 部件来帮助进行 DAO 到 ADO 的移植,并为 OLE DB 供应商提供一般的 DDL 支持。

VB的DAO和ADO区别

Data控件属于DAO,DAO主要适合本机数据库的读写,也可以通过ODBC访问网上的数据库,但效率比较低,一般不采用这种方法,更愿意采用RDO或ADO。如果要使用RDO或ADO的数据库控件都需要另外从部件对话框中添加相应的数据控件,三种方式的数据控件不同。区分你的程序是DAO、RDO,还是ADO的,可以看看打开数据库的方式。DAO使用OpenDatabase方法,RDO使用OpenConnection方法,而ADO一般通过一个ConnectionString来确定数据库的类型和位置。

ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给

ODBC。

一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBC API进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。

不过直接使用ODBC API比较麻烦,所以微软后来又发展出来DAO、RDO、ADO这些数据库对象模型。使用这些对象模型开发程序更容易。这些模型都支持ODBC,所以即使你所访问的数据库没有提供ADO的驱动(或称提供者),只要有ODBC驱动一样可以使用ADO进行访问。

DAO 向 ADO 转化 1. 数据库连接 DAO:

dim db as database set db=opendatabase(\"c:\game.mdb\

ADO 用Connection代替了Database,因为 Connection 可以连接到任何Ole DB数据源上,当然也可以包括非数据库类型的数据,例如文本型数据库.为Access创建Connection的代码如下:

dim dcGame as new adodb.connection dcgame.cursorLocation = aduseclient

dcgame.open \"PROVIDER = Microsoft.Jet.Oledb.3.51;\" & _ \"Data Source= c:\game.mdb;\" 2. 在数据库中执行操作. DAO

dim qdf as querydef

set qdf=db.createquerydef(\"\ qdf.execute set qdf= nothing

ADO 利用command对象完成上述操作. dim cmd as new adodb.command

cmd.commandtext=\"Delete * from fighter\") cmd.commandType=adCmdText

set cmd.activeConnection = dcgame (前边有定义) cmd.execute

querydef 和 command还有一个区别在参数查询上, querydef的参数定义是在SQL语句中,而command(AdO其他对象也如此)的参数定义则完全变为对象定义.

3. 打开数据集 DAO

dim temprec as recordset

set temprec=db.openrecordset(\"Fighter\") (fighter可以是game.mdb中的一个查询或表名) ADO

a. 直接通过 connection

dim gamerec as new adodb.recordset gamerec.cursortype=adOpenKeyset gamerec.LockType=adlockOptimistic

gamerec.open \"fighter\

也可以通过 gamerec.open \"Select * from fighter \ , adCmdTable) b. 通过Command

dim gamerec as new adodb.recordset dim cmd as new adodb.command

cmd.commandtext=\"Select * from fighter\") cmd.commandType=adCmdText

set cmd.activeConnection = dcgame (前边有定义) set gamerec=cmd.execute 4. 数据操作 a. 添加 基本未变. b. 删除 基本未变. c. 修改 DAO:

需要先调用Edit方法, 修改后Update. ADO:

无须调用Edit, 直接修改,而后Update

下面介绍如何在VB中用一个CompactJetDatabase过程实现对Access数据库文件的压缩处理,在这个过程中有一个可

就是在压缩前你是否需要把原有的数据库文件备份到临时目录(True或False)。我用此办法使21.6MB的数据库压缩到仅仅

些代码可放在模块中,在其他窗体也使用

c Declare Function GetTempPath Lib \"kernel32 \" Alias _

tTempPathA \" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

c Const MAX_PATH = 260

c Sub CompactJetDatabase(Location As String, Optional BackupOriginal As Boolean = True) Error GoTo CompactErr strBackupFile As String

strTempFile As String

查数据库文件是否存在

Len(Dir(Location)) Then

果需要备份就执行备份

BackupOriginal = True Then

ckupFile = GetTemporaryPath & \"backup.mdb \"

Len(Dir(strBackupFile)) Then Kill strBackupFile

opy Location, strBackupFile

If

建临时文件名

mpFile = GetTemporaryPath & \"temp.mdb \"

Len(Dir(strTempFile)) Then Kill strTempFile

过DBEngine压缩数据库文件

ngine.CompactDatabase Location, strTempFile

除原来的数据库文件

Location

贝刚刚压缩过临时数据库文件至原来位置

opy strTempFile, Location

除临时文件

strTempFile

If

pactErr:

Sub

Sub

c Function GetTemporaryPath() strFolder As String

lngResult As Long

lder = String(MAX_PATH, 0)

esult = GetTempPath(MAX_PATH, strFolder)

ngResult <> 0 Then

emporaryPath = Left(strFolder, InStr(strFolder, Chr(0)) - 1)

If

Function

= \" \"

emporaryPath

因篇幅问题不能全部显示,请点此查看更多更全内容

Top