数据库访问技术分那些类别啊?急求

数据库访问技术分那些类别啊?急求,第1张

随着数据产品和技术的发展,数据库访问技术也从ODBC、DAO、RDO、OLE DB、ADO 和 RDS发展到今天的ADO.NET。以下内容由城市刀客整理编辑,旨在为你展示数据库访问技术的概貌。

<!--[if !supportEmptyParas]-->

ODBC<!--[endif]-->

ODBC 技术为访问不同的SQL 数据库提供了一个共同的接口。ODBC 使用 SQL 作为访问数据的标准。这一接口提供了最大限度的互 *** 作性:一个应用程序可以通过共同的一组代码访问不同的 SQL 数据库管理系统 (DBMS)。开发人员可以添加数据库驱动程序,将应用程序与用户所选的 DBMS 联系起来。驱动程序管理器提供应用程序与数据库之间的中间链接。ODBC 接口包含一系列功能,由每个 DBMS 的驱动程序实现。当应用程序改变它的 DBMS 时,开发人员只使用新的 DBMS 驱动程序替代旧的驱动程序,并且应用程序可以无需修改代码照常运行。

<!--[if !supportEmptyParas]-->

标准 ODBC 结构的关系图如下:

DAO &RDO

DAO 是建立在 Microsoft Jet Microsoft Access 的数据库引擎基础之上的。Jet 是第一个连接到 Access 的面向对象的接口。使用 Access 的应用程序可以用 DAO 直接访问数据库。由于 DAO 是严格按照 Access 建模的,因此,使用 DAO 是连接 Access 数据库最快速、最有效的方法。DAO 也可以连接到非 Access 数据库,例如,SQL Server 和 Oracle。DAO 使用 ODBC,但是由于 DAO 是专门设计用来与 Jet 引擎对话的,Jet 将解释 DAO 和 ODBC 之间的调用。使用除 Access 之外的数据库时,这种额外的解释步骤导致较慢的连接速度。如下图所示:

<!--[if !supportEmptyParas]--><!--[endif]-->

要克服这样的限制,Microsoft 创建了 RDO。图 Application1 显示了 RDO 如何直接访问 ODBC API,而无需通过 Jet 引擎。不久之后,Microsoft 推出了 ODBCDirect,它是 DAO 的扩展,在后台使用 RDO。图 Application2 显示 ODBCDirect 如何允许现有的 DAO 应用程序访问数据库,而没有 Jet 引擎产生的性能损失。

OLE DB

OLE DB 建立于 ODBC 之上,并将此技术扩展为提供更高级数据访问接口的组件结构。此结构对企业中及 Internet 上的 SQL、非 SQL 和非结构化数据源提供一致的访问。(实际上,在访问基于 SQL 的数据时,OLE DB 仍使用 ODBC,因为对于 SQL 它是最优结构。)

OLE DB 由三个组件构成:数据使用者(例如,一个应用程序);包含并公开数据的数据提供程序以及处理并传输数据的服务组件(例如,查询处理器、游标引擎)。OLE DB 是一个针对 SQL 数据源和非 SQL 数据源(例如,邮件和目录)进行 *** 作的 API。如下图所示:

OLE DB 为 C 和 C++ 程序员及使用其他包含 C 样式函数调用语言的程序员提供绑定。有一些语言(例如 VB 和 VBScript)不提供指针数据类型(地址变量)。因此,这些语言不能使用 C 样式绑定,而且不能直接调用 OLE DB。<!--[if !supportEmptyParas]--><!--[endif]-->

在此基础上,Microsoft 推出了另一个数据访问对象模型:ADO。ADO 采用基于 DAO 和 RDO 的对象,并提供比 DAO 和 RDO 更简单的对象模型(尽管会产生一些冗余的功能,如现在进行一项 *** 作时可以用不止一种方法)。ADO 中的对象层次结构比 DAO 中的更平缓。ADO 包含一些简化对数据存储区数据的访问任务的内置对象。

<!--[if !supportEmptyParas]-->

下图显示了应用程序连接到数据库可采取的许多途径。例如,VB 程序员可以使用 ADO 将应用程序连接到 OLE DB 提供程序。如果数据库不支持 OLE DB,应用程序可以通过 ODBC 连接。Visual C++ (VC++) 程序员可以使用 ADO 或直接通过 OLE DB 连接。

让我们看一个简单示例,它显示 ADO 是如何运行的。清单 1 显示可如何使用典型的记录集对象--ADO 中的核心对象。记录集对象表示一系列记录(很像一个表),并支持游标类型,例如,adOpenForwardOnly、adOpenKeyset、adOpenDynamic 和 adOpenStatic。游标可以在服务器端(默认情况下),也可在客户端。<!--[if !supportEmptyParas]--><!--[endif]-->

清单 1

<!--#include file="adovbs.inc"-->

<%

Dim connStr, rs

connStr = "Provider=SQLOLEDB.1Persist Security Info=FalseUser ID=saInitial Catalog=pubsData Source=localhost"

SET rs= Server.CreateObject("ADODB.Recordset")

<!--[if !supportEmptyParas]-->rs.Open "Authors", connStr, adOpenForwardOnly, adLockOptimistic, adCmdTable

WHILE NOT rs.EOF

response.write rs("au_fname") &"," &rs("au_lname") &"<br>"

rs.moveNext

END

SET rs=nothing

%>

<!--[if !supportEmptyParas]-->

要访问一条记录,ADO 需要按顺序扫描记录集。要访问多个表,需要执行 JOIN 查询,并将返回的结果作为记录集。虽然记录集对象支持断开的数据访问,ADO 还是主要为连接的数据访问而设计。这种连接的访问模式占用服务器端的重要资源。另外,要传输记录集,必须使用 COM 封送处理。COM 封送处理是数据类型转换过程,这种转换占用额外的系统资源。<!--[if !supportEmptyParas]--><!--[endif]-->

从 ADO 2.1 开始,Microsoft 将 XML 支持添加到 ADO 对象模型,这样就可将记录集保存为 XML 文档。然而,直到 ADO 2.5 出现,ADO 2.1 中 XML 支持的一些限制(例如,分层记录集对象的保持)才被取消。虽然 ADO 可以将 XML 文档读入记录集,但它只能读取名为高级数据表图 (Advanced Data TableGram, ADTG) 的专用架构。<!--[if !supportEmptyParas]--><!--[endif]-->

Microsoft 希望拥有断开的数据访问机制,它扩展了 ADO 并推出远程数据服务 (RDS)。RDS 是按照 ADO 建模的,无需实时连接就可以使记录集传输到客户端(例如,Web 浏览器)。然而,如同 ADO 一样,RDS 使用 COM 封送处理将记录集从服务器传输到客户端。

ADO.NET

在开始设计 .NET 框架时,Microsoft 就以此为契机重新设计了数据访问模型。Microsoft 没有进一步扩展 ADO,而是决定设计一个新的数据访问框架,但保留了缩写词。Microsoft 根据其成功的 ADO 对象模型经验设计了 ADO.NET。但 ADO.NET 满足了 ADO 无法满足的三个重要需求:提供了断开的数据访问模型,这对 Web 环境至关重要;提供了与 XML 的紧密集成;还提供了与 .NET 框架的无缝集成(例如,兼容基类库类型系统)。

下图显示了 ADO.NET 的结构。但缺少了能够在 ADO 中执行诸多功能的记录集对象。ADO.NET 具有几个专用对象以执行特定任务,用于代替记录集对象。表 1 描述了其中的三个专用对象:DataAdapter、DataReader 和 Dataset。

表一:

DataAdapter The DataAdapter object provides a bridge between the database and a DataSet. The key advantage of DataAdapter is that it can work with any data source. The data source might be a database or it might be an XML document.

//DataAdapter提供了一个数据库与DataSet之间的桥梁。它最大的优点在于能工作于不同的数据源,这些数据源可以是数据库,也可以是 XML文件。

DataReader The DataReader object provides an efficient way to retrieve records on the server side. DataReader is a connected, read-only, and forward-only data-access mode. This object is useful for Web applications, which use DataReader to display records on Web pages.

//DataReader对象提供了从服务器端高效获取数据的途径,它是在只读和只进的连接模式下从数据源读取数据的,这个对象对通过网页展示数据记录的Web应用程序开发很有用。

DataSet The DataSet object provides disconnected copies of records from a database. The DataSet object stores records from a table (or multiple tables) in memory without holding a connection to the server. When in memory, DataSet is a binary object. When the DataSet is remoted, transferred, or serialized, it''s represented as a DiffGram—an XML format. Because XML is plaintext, records can be exchanged easily over the Web, bypassing firewall restrictions(限制性). DataSet also contains various objects—such as constraints(压缩), relationships, and views—that let you manipulate( *** 作) tables on the client side instead of working through one Recordset in ADO.

//DataSet对象在断开数据库连接的情况下提供了一个数据库内容的拷贝,它把记录从表中取出,以二进制对象的形式存放在内存中。当Dataset被调用的时候,它表现为DiffGram--一种XML格式。

复制代码

代码如下:

<?php

/*

MYSQL

数据库访问封装类

MYSQL

数据访问方式,php4支持以mysql_开头的过程访问方式,php5开始支持以mysqli_开头的过程和mysqli面向对象

访问方式,本封装类以mysql_封装

数据访问的一般流程:

1,连接数据库

mysql_connect

or

mysql_pconnect

2,选择数据库

mysql_select_db

3,执行SQL查询

mysql_query

4,处理返回的数据

mysql_fetch_array

mysql_num_rows

mysql_fetch_assoc

mysql_fetch_row

etc

*/

class

db_mysql

{

var

$querynum

=

0

//当前页面进程查询数据库的次数

var

$dblink

//数据库连接资源

//链接数据库

function

connect($dbhost,$dbuser,$dbpw,$dbname='',$dbcharset='utf-8',$pconnect=0

,

$halt=true)

{

$func

=

empty($pconnect)

?

'mysql_connect'

:

'mysql_pconnect'

$this->dblink

=

@$func($dbhost,$dbuser,$dbpw)

if

($halt

&&

!$this->dblink)

{

$this->halt("无法链接数据库!")

}

//设置查询字符集

mysql_query("SET

character_set_connection={$dbcharset},character_set_results={$dbcharset},character_set_client=binary",$this->dblink)

//选择数据库

$dbname

&&

@mysql_select_db($dbname,$this->dblink)

}

//选择数据库

function

select_db($dbname)

{

return

mysql_select_db($dbname,$this->dblink)

}

//执行SQL查询

function

query($sql)

{

$this->querynum++

return

mysql_query($sql,$this->dblink)

}

//返回最近一次与连接句柄关联的INSERT,UPDATE

或DELETE

查询所影响的记录行数

function

affected_rows()

{

return

mysql_affected_rows($this->dblink)

}

//取得结果集中行的数目,只对select查询的结果集有效

function

num_rows($result)

{

return

mysql_num_rows($result)

}

//获得单格的查询结果

function

result($result,$row=0)

{

return

mysql_result($result,$row)

}

//取得上一步

INSERT

*** 作产生的

ID,只对表有AUTO_INCREMENT

ID的 *** 作有效

function

insert_id()

{

return

($id

=

mysql_insert_id($this->dblink))

>=

0

?

$id

:

$this->result($this->query("SELECT

last_insert_id()"),

0)

}

//从结果集提取当前行,以数字为key表示的关联数组形式返回

function

fetch_row($result)

{

return

mysql_fetch_row($result)

}

//从结果集提取当前行,以字段名为key表示的关联数组形式返回

function

fetch_assoc($result)

{

return

mysql_fetch_assoc($result)

}

//从结果集提取当前行,以字段名和数字为key表示的关联数组形式返回

function

fetch_array($result)

{

return

mysql_fetch_array($result)

}

//关闭链接

function

close()

{

return

mysql_close($this->dblink)

}

//输出简单的错误html提示信息并终止程序

function

halt($msg)

{

$message

=

"<html>\n<head>\n"

$message

.=

"<meta

content='text/htmlcharset=gb2312'>\n"

$message

.=

"</head>\n"

$message

.=

"<body>\n"

$message

.=

"数据库出错:".htmlspecialchars($msg)."\n"

$message

.=

"</body>\n"

$message

.=

"</html>"

echo

$message

exit

}

}

?>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10030736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存