使用ADO 访问 SQL Server

ADO对象模型组成

ADO是一组由微软提供的COM组件基于面向对象思想的编程接口。它建立在COM体系结构之上它的所有接口都是自动化接口因此在C++、VisualBasic、Delphi等支持COM的开发语言中通过接口都可以访问到ADO。ADO对象模型非常精炼由三个主要对象Connection、Command、Recordset和几个辅助对象组成。对象间的关系如图1所示

spacer.gif

图1

 

 

几个关键对象的作用如下所示

Connection对象

创建与数据库互动所需的连接Connection对象提供OLE DB数据源和对话对象之间的关联它通过用户名称和口令来处理用户身份的鉴别并提供事务处理的支持它还提供执行方法从而简化数据源的连接和数据检索的进程。任何数据库的操作行为都必需在连接基础底下进行。因此在使用ADO之前首先便需创建一个Connection对象。必需注意的是这个动作不是绝对的ADO本身会在没有Connection对象的情形之下自行创建所需的连接对象。

通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句如一个存储过程。

 

Command对象

Command对象封装了数据源可以解释的命令它针对连接的数据库进行数据变动该命令可以是SQL命令、存储过程或底层数据源可以理解的任何内容。将用户提供的指令传送到数据库进行新增、删除或是修改资料等变动处理。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

 

Recordset对象

Recordset用于表示从数据源中返回的表格数据它封装了记录集合的导航、记录更新、记录删除和新记录的添加等方法还提供了批量更新记录的能力。它向连接的数据库提出取得符合特定条件的数据内容。应用程序从Recoreset对象的身上取得所要查看处理的特定数据内容这数据可能是某个特定数据表的全部或是特定内容或是跨越多个数据所取得关系型数据以二维数组的表格形式作展现。

它对记录集提供了更多的控制功能如记录锁定游标控制等。

 

以下这些对象是为完成数据库访问而设置的辅助对象他们配合上面几个关键对象来完成具体的访问工作。

Record对象

Record对象表示记录集Recordset或者是数据提供者上的一条记录它提供了对单条记录的数据字段的操作通过它对数据字段进行读取、修改。

 

Stream对象

Stream流对象主要用来处理记录集中的二进制数据流的如文件内容或者图片对象等。

 

Fields集合和Field对象

Fields集合处理记录中的各个列。记录集中返回的每一列在Fields集合中都有一个相关的Field对象。Field对象使得用户可以访问列名、列数据类型以及当前记录中列的实际值等信息。

 

Parameters集合Parameter对象

Command对象包含一个Parameters集合。Parameters集合包含参数化的Command对象的所有参数每个参数信息由Parameter对象表示。

 

Properties集合和Property对象

Connection、Command、Recordset和Field对象都含有Proiperties集合。Properties集合用于保存与这些对象有关的各个Property对象。Property对象表示各个选项设置或其他没有被对象的固有属性处理的ADO对象特征。

 

Errors集合和Error对象

Connection对象包含一个Errors集合。Errors集合包含的Error对象给出了关于数据提供者出错时的扩展信息。

 

spacer.gif以上为ADO对象模型的各对象间的概要描述对于各个对象的具体使用方法和使用场合我们将在以后章节中展开讲解、并将会给出实际的使用例子。

 

 

代码例子展示       

数据库主要是用来做数据的存储并进行数据添加、访问、修改操作的。我们就看看如何通过ADO的关键对象来完成这些功能。

我们假设要做一个学生信息管理的软件那么就需要存储每个学生的资料我们可以使用Access建立一个学生信息的数据库”classdat.mdb”并建立测试的表如下

spacer.gif 

 

图2

 

 

表中输入如下数据然后我们将演示如何对此数据库进行访问操作。

 

图3

 

 

首先要操作任何数据库首先要连接数据库我们通过Connection对象进行该操作。

view plaincopy toclipboardprint?

1. HRESULT hr;  

2. _ConnectionPtr pConnection;   // 连接源  

3.        _bstr_t strConn("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"");  

4.        strConn += _T(“classdat.mdb”); // 此处是指向数据库文件名  

5.        strConn += "\"";  

6.        hr = pConnection.CreateInstance(_uuidof(Connection));  

7.        pConnection->Open(strConn, """", NULL);  

 

      

以上代码为了便于说明去掉了容错代码。只为了突出功能代码。

通过以上代码就能与数据库建立连接并保存在智能指针pConnetion之中。

其他的ADO对象都要通过此对象与数据库操作。

       然后要获取数据表的内容需要通过Recordset对象和Connetion对象协作完成。

例如我们需要查看学生表Students里的学生信息首先要打开表记录可通过如下代码完成。

      

view plaincopy toclipboardprint?

1. _RecordsetPtr pRecordset;  

2.        pRecordset.CreateInstance( __uuidof( Recordset ));  

3.        pRecordset->Open(_variant_t("select * from Students"), _variant_t((IDispatch *)pConnection, true), adOpenKeyset, adLockOptimistic, adCmdText);  

 

具体参数现在不解释只要理解Recordset用于打开记录集合并表示数据集。然后通过辅助对象获取记录集合中的记录字段内容。如下我们通过CString对象strStudentName来接收字段StudentName的内容。

      

view plaincopy toclipboardprint?

1. CString strStudentName = pRecordset->Fields->GetItem( _variant_t(1L) )->Value;  

 

这样strStudentName的值将是数据库中第一条记录的StudentName字段的内容--”李丹”。其他字段可按同样的方法得到。

     透过Recordset我们还可以修改数据及删除数据。例如我们要将数据李丹的名字修改为李双可以通过如下代码实现

      

view plaincopy toclipboardprint?

1. pRecordset->Fields->GetItem( _variant_t(1L) )->Value = _T(“李双”);  

2.      pRecordset->Update();  

 

     加入要删除当前数据可直接通过

view plaincopy toclipboardprint?

1. pRecordset->Delete( AffectEnum::adAffectCurrent );  

 

可能同学们看到这里要问目前只能修改删除李丹这个同学的资料没错如果要浏览数据就要了解Recordset的重要的浏览功能MoveNext及MovePrev。

要查看前一条记录可以

view plaincopy toclipboardprint?

1. pRecordset->MovePrevious();  

 

要查看后一条记录可以

view plaincopy toclipboardprint?

1. pRecordset->MoveNext();  

 

此外还有一个重要的对象是Command对象它同样是用来处理数据集的。而且提供了更高级的概念提供了更多高级的数据操作功能。将在以后章节进行展开说明。至此同学们应该对ADO对象有了大概了解了而且也熟悉了他们的基本用法。

 

ADO特点总结

Ado是Windows系统上访问数据库比较成熟的技术之一凭借其自身的特点自它出现后不久就迅速流行开来。ADO是应用微软COM 组件编程比较成功的项目这也得益于COM组件的优势。而且COM是高度面向对象的思想。提供了二进制级别的组件共享机制。这使得ADO具有易于使用、访问灵活、应用广泛、数据类型丰富、高效的特点。

首先ADO非常易于使用。

这是ADO技术的最重要的一个特征是它能够流行起来的重要原因。由于ADO是高层应用封装了许多底层工作将底层的繁琐操作进行封装并对外提供统一的接口。所以相对于OLE DB或者ODBC来说它具有面向对象的特性。同时在ADO的对象结构中其对象之间的层次关系并不明显。相对于DAO等访问技术来讲又不必关心对象的构造顺序和构造层次。对于要用的对象不必选建立连接、会话等对象只需直接构造即可方便了应用程序的编制。特别是在Visual C++编程中通过对自动化对象进行的封装对COM组件提供了统一的编程界面只要懂得COM编程的基础就很容易上手。同时对于脚本语言的支持也在一定程度上降低了使用的门槛。

其次ADO具有ODBC的主要功能而且ADO适用的数据源的范围要大的多。

ADO技术可以访问包括关系数据库和非关系数据库的所有文件系统。它提供了访问ODBC的接口所以可以访问ODBC能够访问的所有数据。不仅如此它还可以访问非关系型的数据库如文本文件。并对这些不同的数据的访问提供了统一的接口。这同样有利于降低程序编写的难度。使用ADO 将适用于ODBC兼容的数据库和 OLE DB 兼容的数据源包括 MS SQLSERVER、Access、Oracle、Excel、文本文件等。可以看出ADO所支持的数据库范围是非常广泛的。

还有ADO具备高速访问数据源的能力。

由于ADO技术基于OLE DB所以它也继承了OLE DB访问数据库的高速性。ADO 通过一个小型的自动化接口建立一个简单而高效的到达OLE DB的中间层。所以其速度几乎与OLE DB相差无几 不过ADO 却能让你不需要了解OLE DB的底层繁琐的COM接口。

其次ADO可以用于MicrosoftActiveX页

因为ADO基于COM技术所以可以通过COM接口与其他的COM对象进行交互。它可以作为ADO控件的形式出现。所以可应用于所有支持ActiveX的语言例如一些脚本语言也可以通过自动化接口与ADO通信从而大大的扩大了ADO的应用范围也使得基于ADO的程序具有更广泛的支持度。

此外基于ADO的程序占用资源较少

由于ADO是基于组件对象模型COM的访问技术它是一个二进制代码共享机制本身就是为了节约资源而设计的。ADO组件被作为公共组件被所有程序调用。所以用ADO产生的应用程序占用内存少。通过上一节我们也了解了ADO还允许同一Connection实例下有多个Record set实例。

最后ADO允许进行批更新使用的Update Batch方法

ADO的批更新操作可大大减轻网络负担提高数据库处理效率。

通过以上分析我们看到ADO具有许多鲜明的优点。这也是它在产生出来后迅速得到广泛应用的魅力所在。尤其是通过VC对COM进行访问时更能凸显ADO的快速高效、接口简便的特点。

 

 

 

我们知道程序界有一个著名公式是:程序=数据+算法。这充分说明了数据在程序设计中的重要地位。而当数据规模达到一定程度的时候为了达到数据的快速存储和快速访问就必须使用数据库Database来进行数据的存储。因为数据库是按照数据结构来组织、存储和管理数据的仓库利用数据库进行存储具有存储访问快速、管理方便、合理组织、减少数据的冗余度等优势。

数据库有很多种类型从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。数据库模型有层次结构模型、网状结构模型、关系结构模型本篇章主要介绍应用范围最广泛的关系型数据库的访问技术。

Visual C++数据库开发的特点

一、              丰富的数据库访问技术可供选择

Visual C++6.0提供了多种多样的数据库访问技术—ODBC API、MFC ODBC、DAO、OLE DB、ADO等。这些技术各有特点用户可按自己的技术熟练程度及项目特点选择适合自己的开发技术。

二、              VC提供的可视化向导功能简化开发过程

利用VC提供的AppWizard和ClassWizard用户可以方便地开发出性能优良的基于MFC的数据库应用程序。你甚至不需要编写一句代码直接通过鼠标点选就能生成一个完整的简单数据库应用程序。

三、              强大的IDE编译器大大提高了开发的效率。

VC的IDE是目前世界上功能最强大的编译器之一。利用该IDE所提供的各种辅助工具可方便快速的进行程序编写、编译、链接、调试程序相比一般的编译器在效率上有明显提高。

四、              开发方式灵活开发难度适中

Visual C++进行数据库开发可选择的开发方式多种多样。既可进行面向过程的开发也可按面向对象的方式进行开发。既可直接调用汇编的代码也可以通过DLL动态库的方式与其它程序语言进行混合编程。丰富的类库及COM库为开发提供了强大的支持。

五、              良好的架构使其具有较好的可扩展性

Visual C++具有面向对象编程的特性。通过抽象性、继承、重载、多态等特性面向接口编程可使整个数据库系统具有良好的架构支持良好的扩展性。利用面向接口编程及COM组件编程技术各个部件可进行无缝替换极大的提高了程序的可扩展性及健壮性。

六、              程序执行效率高运行速度快

我们知道C++语言在高级语言里是属于与机器语言比较接近的语言所以它的执行效率一般来说仅次于汇编语言。而且在执行效率要求比较高的地方可以直接内嵌汇编这大大提高了程序的执行效率。而且Visual C++更通过代码优化技术可让程序的执行效率提高百分之十几。这是其它高级语言所无法比拟的。

Visual C++数据库开发技术

如前所述Visual C++为数据库开发提供了多种多样的技术支持。用户可供选择的数据库访问技术包括ODBCOpen DataBase Connectivity、MFC ODBC(Microsoft Foundation Classes ODBC)、DAO(Data Access Object)、OLE DB(Object Link and EmbeddingDataBase)、ADO(ActiveX Data Object)。这些技术都有各自的特点适用范围也不尽相同所以用户一般需要根据技术的特点和项目的特征进行恰当的选择。

1、ODBC

优点ODBC是客户应用程序访问关系数据库时提供的一个统一的接口ODBC提供了一套统一的API应对不同的数据库访问这样使应用程序可以只针对ODBC的API来进行程序编写就可访问任何提供了ODBC驱动程序的数据库。此外ODBC还是一种业界标准几乎所有的关系数据库都提供了相应的ODBC驱动程序所以具有广泛的应用。

缺点不过由于ODBC只能用于关系型数据库使得ODBC很难访问对象数据库及其它非关系型数据库。而且由于ODBC是一个接口层需要为各种不同的数据库提供适应性必然会使效率有所降低。此外在使用ODBC时需要向系统注册一个数据源这增加一定的配置难度。还需要通过大量的ODBC统一接口API来对数据库访问也提高了一定的开发难度。

2、MFCODBC

优缺点因为MFC ODBC只是通过MFC类库MFC ODBC对ODBC的API进行了一层简单封装使API更容易被使用所以它的优缺点就跟ODBC一样只是降低了一定的开发难度。

3、DAO

优点DAO数据访问对象是一种应用程序编程接口API它是微软提供的用于访问Microsoft Jet数据库文件(*.mdb)的强有力的数据库开发工具。DAO是微软的第一个面向对象的数据库接口各个DAO对象协同工作。通过Jet函数它还可以访问其他的结构化查询语言SQL数据库。因为DAO直接内嵌在ACCESS运行环境中DAO是访问mdb文件有最高效率的数据库引擎。MFC也提供了一组DAO类封装了底层的API而且VC向导也提供了对DAO的支持从而大大简化了程序的开发。此外不必在ODBC管理器中注册DSN。

缺点DAO是基于MicrosoftJet引擎的只能访问Jet引擎支持的桌面数据库。所以要访问SqlServer必须通过ODBC来进行访问。

4、OLEDB

优点OLE DB是VisualC++开发数据库应用中提供的新技术。OLE DB对所有的文件系统包括关系数据库和非关系数据库都提供了统一的接口。所以使用OLE DB可以对大部分数据库进行广泛的支持。同时它是低级应用程序接口所以在效率上比ODBC高。

缺点直接使用OLE DB来设计数据库应用程序需要大量的代码。即便可以通过ATL模板来减少一定的工作量其开发难度也是相对较大的。可以说他是所有数据库编程接口中难度最大的。

5、ADO

优点ADO是一种面向对象的编程接口它向我们提供了一个熟悉的高层的对OLE DB的Automation封装接口。它继承了OLE DB技术的优点具有易于使用、访问效率高、功能强大的特点。因为是面向对象的内部通过各个对象相互作用实现。既可访问关系型数据库也可访问非关系型数据库。

缺点唯一缺点应该是基于COM技术所以不能跨平台使用只能用在支持COM接口的机器上也就是微软的视窗系统了。对于使用VC++来进行开发的话也不能算是一个缺点了

 

 

 

 

 

 

 

 

 

摘要随着数据库产品和技术的发展数据库访问技术也从ODBC、DAO、RDO、OLE DB、ADO 和 RDS发展到今天的ADO.NET。以下内容旨在为你展示数据库访问技术的概貌。

ODBCOpen Database Connectivity开放数据库互连

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

标准 ODBC 结构的关系图如下

标准 ODBC 结构的关系图

 

DAO & RDOData AccessObjects 数据访问对象 & Remote Data Objects远程数据对象

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 之外的数据库时这种额外的解释步骤导致较慢的连接速度。如下图所示

使用数据访问对象 (DAO) 访问数据库

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

使用RDO 直接访问 ODBC

 

OLE DBObject Linking and Embedding,Database对象链接嵌入数据库

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

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

OLE DB

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

ADOActiveX Data ObjectsActiveX数据对象

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

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

应用程序连接到数据库的途径

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

清单 1

<%

    Dim connStr, rs
    connStr = "Provider=SQLOLEDB.1;Persist SecurityInfo=False;User ID=sa;Initial Catalog=pubs;Data 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
%>

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

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

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。

ADO.NET 结构

表一

DataAdapter The DataAdapter object provides a bridge between the databaseand a DataSet. The key advantage of DataAdapter is that it can work with anydata source. The data source might be a database or it might be an XMLdocument.

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

DataReader The DataReader object provides an efficient way to retrieverecords on the server side. DataReader is a connected, read-only, andforward-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 adatabase. The DataSet object stores records from a table (or multiple tables)in memory without holding a connection to the server. When in memory, DataSetis a binary object. When the DataSet is remoted, transferred, or serialized,it's represented as a DiffGram—an XML format. Because XML is plaintext, recordscan be exchanged easily over the Web, bypassing firewall restrictions限制性. DataSet also contains various objectssuch asconstraints压缩, relationships, and viewsthat let youmanipulate操作 tables on the client side instead ofworking through one Recordset in ADO.

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章