ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序。

 

 

重点:

Ø      Ado.Net组件的作用

Ø      Ado.Net组件的组成部分

Ø      .Net数据提供程序

Ø      DataSet

 

 

 

预习功课:

Ø      Ado.Net是什么?

Ø      Ado.Net的起何种作用

Ø      Ado.Net组件的组成部分

开发Ado.Net程序需要注意事项

 

开篇故事:

林林在大学期间有过一段实习经历,在实习的过程中她不经意间发现自己工作的地方居然和一个著名软件公司相距咫尺。很快她就知道该公司采用的是国际化的管理模式,效益非常好,是盛产"IT精英"的好地方,于是她便产生了加盟该软件公司的念头。不过打听之后林林却抽了一口冷气:公司用人非常苟刻,尽管前来应聘的都是大学生中的佼佼者,但淘汰率仍高达90%,更可气的是该公司基本不会给女性晋升管理层的机会,所以直接应聘几乎没有可能。然而她没有放弃,她选择了另外一种方式--"曲线救国"。

在工作之余,林林走遍了全市的大街小巷,搜集了所有同类产品的相关资料,对接触过该公司软件产品的人群进行咨询。

上至政府高官、公司老板,下至学生、公司职员,她都悉心请教不厌其烦。两个月下来,林林瘦了一圈,但她却整理了近百页的调查分析报告。在这些报告中,她提供了各种准确数据,分析了软件公司的业务模式和不同人群的用户需求,以及同类软件产品市场的发展动态等,更重要的是,林林发现了该公司市场覆盖的盲点和潜在的危机,而且附上了自己的建议,当然还有求职申请。

当这饱含林林心血的调查报告通过有效渠道送达公司总裁的案头后,该公司领导层当天即召开公司会议,就林林提供的材料一一进行讨论。一周后,该公司总裁亲自驾车邀林林加盟。

后来林林的同事告诉她,当时公司就要不要她直接进入管理层进行了非常激烈的争论,因为软件行业的特点该公司管理层不接纳女性似乎成了惯例。但最后总裁发话:"用事实说话,我看林小姐所做的诸位不一定都能做到,那么你们能呆在这里开会她为什么不能?再说,这样的人才我们如果不加以重用,我们的竞争对手可不会不要,那样将使我们面临更大的威胁!"

对于公司而言,也许一个普通的应届生并不是他们所需要的,他们需要的是能直接为公司创造价值的"人才"。所以,在做任何事情之前,如果我们能做到"知己知彼",充分了解对方的各种信息,明白企业到底需要什么,从而作出相应的反应和对策,无疑是最好的。其实,做技术开发亦是如此!

 

 

数据库的应用在我们的生活和工作中已经无处不在,无论是一个小企业的OA系统,还是中国移动的运营系统,似乎都离不开数据库的应用。对于大多数应用程序来说,不管它们是Windows桌面应用程序,还是Web应用程序,存储和检索数据都是其核心功能。所以针对数据库的开发已经成为软件开发的一种必备技能。如果说过去是"学好数理化,走遍天下都不怕",那么,对于今天的软件开发者而言就是"学好数据库,走到哪儿都不怵!"。

 

调用

 

 

操作

 

前面我们已经学习过Winform和SqlServer 2005数据库了,那么二者是如何联系起来的呢?.Net 提供了Ado.Net组件让我们可以访问和操作数据库。Ado.Net组件对于编写者来说这是一套类、一些调用方法,我们可以通过系统提供的这些数据库访问类或方法做到链接数据库、获得数据库数据、修改数据库数据等。一言蔽之:Ado.Net是数据库与.Net应用程序之间的桥梁。如下图:

数据库

 

 

Ado.Net

 

 

.Net应用程序

 

 

ADO.NET是微软新一代.NET数据库的访问架构,ADO是ActiveXData Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用来开发数据库应用程序。

 

1.ADO.Net的组成部件:

在.Net框架中Ado.Net分两类组件来访问和处理数据库数据:

n       .Net Framework数据提供程序

n       数据集(DataSet)

 

下图阐释了 .NET Framework 数据提供程序和 DataSet 之间的关系。

ADO.NET 结构

C#二十四 Ado.Net简介_数据库

 

1.1   .NET数据提供程序(.NET Data Provider)

.NET数据提供程序是一个类集,用于连接到数据库、执行命令和检索结果。可以直接处理检索到的结果,或将其放入DataSet对象中。它可以被认为是数据库与应用程序的一个接口件或中间件。由于现在使用的数据源有多种(SQL Server、OLEDB 、ODBC、Oracle),在编写应用程序的时候就要针对不同的数据源编写不同的接口代码,这很麻烦,效率也不高,针对这一问题Data Provider向上(应用程序)提供了统一的编程模型,向下(数据源)提供了多种数据源的接口,这样一来就可以使应用程序不需关心什么数据源,即对数据源进行了屏蔽,其好处是无论什么样的数据源,对于应用程序来说都只需提供一种编程模式即可。

 

针对不同的数据源,目前在.NET平台中包含如下.NET数据提供程序:

 

.NET Framework 数据提供程序

说明

SQL Server

.NET 数据提供程序

Microsoft SQL Server 数据源

System.Data.SqlClient 命名空间

OLE DB

.NET 数据提供程序

OLE DB 公开的数据源

System.Data.OleDb命名空间

ODBC

.NET 数据提供程序

ODBC 公开的数据源

System.Data.Odbc命名空间

Oracle

.NET 数据提供程序

Oracle 数据源

System.Data.OracleClient 命名空间

 

 

 

NET Framework 数据提供程序的核心对象

 

下表概述了组成 .NET Framework 数据提供程序的四个核心对象。

对象

说明

Connection

建立与特定数据源的连接。 所有 Connection 对象的基类均为 DbConnection 类。

Command

对数据源执行命令。 公开 Parameters,并可在 Transaction 范围内从Connection 执行。 所有 Command 对象的基类均为 DbCommand 类。

DataReader

从数据源中读取只进且只读的数据流。 所有 DataReader 对象的基类均为 DbDataReader 类。

DataAdapter

使用数据源填充 DataSet 并解决更新。 所有 DataAdapter 对象的基类均为 DbDataAdapter 类。

 

1.2   数据集(DataSet)

 

DataSet专门为独立于任何数据源的数据访问而设计。因此,它可以用于多种不同的数据源,用于XML数据,或用于管理应用程序本地的数据。DataSet包含一个或多个DataTable对象的集合,这些对象由数据行和数据列,以及有关DataTable对象中数据的主键、外键、约束和关系信息组成。

我们可以看一下ADO.NET的多数据库连通性的特点,如图5-2所示。

 

C#二十四 Ado.Net简介_数据库_02

 

多个类型数据库,上层共享单一DataSet对象,实现单应用程序下多数据库底层支持。

本章不再使用大量篇幅来阐述ADO.NET的原理细节,而从实际项目应用的角度言简意赅地说明ADO.NET的使用方法和常见问题

 

2. 趣味理解ADO.NET对象模型

为了更好地理解ADO.NET的架构模型的各个组成部分,我们可以对ADO.NET中的相关对象进行图示理解,如图5-3所示的是ADO.NET中数据库对象的关系图。

 

C#二十四 Ado.Net简介_数据库_03

C#二十四 Ado.Net简介_数据库_04

 

       数据库好比水源,存储了大量的数据。

       Connection好比伸入水中的进水笼头,保持与水的接触,只有它与水进行了“连接”,其他对象才可以抽到水。

       Command则像抽水机,为抽水提供动力和执行方法,通过“水龙头”,然后把水返给上面的“水管”。

       DataAdapter、DataReader就像输水管,担任着水的传输任务,并起着桥梁的作用。二者是有不同的,后面章节中将详细介绍。

       DataSet则是一个大水库,把抽上来的水按一定关系的池子进行存放。即使撤掉“抽水装置”(断开连接,离线状态),也可以保持“水”的存在。这也正是ADO.NET的核心。

        DataTable则像水库中的每个独立的水池子,分别存放不同种类的水。一个大水库由一个或多个这样的水池子组成。

 

3. ADO.NET 的好处

 

与 ADO 的早期版本和其他数据访问组件相比,ADO.NET 提供了若干好处。这些好处分成以下几个类别:

互操作性

ADO.NET 应用程序可以利用 XML 的灵活性和广泛接受性。由于 XML 是用于在网络中传输数据集的格式,因此可以读取 XML 格式的任何组件都可以处理数据。实际上,接收组件根本不必是 ADO.NET 组件:传输组件可以只是将数据集传输给其目标,而不考虑接收组件的实现方式。目标组件可以是 Visual Studio 应用程序或无论用什么工具实现的其他任何应用程序。唯一的要求是接收组件能够读取 XML。作为一项工业标准,XML 正是在谨记这种互操作性的情况下设计的。

可维护性

在已部署系统的生存期中,适度的更改是可能的,但由于十分困难,所以很少尝试进行实质的结构更改。这是很遗憾的,因为在事件的自然过程中,这种实质上的更改会变得很有必要。例如,当已部署的应用程序越来越受用户欢迎时,增加的性能负荷可能需要进行结构更改。随着已部署的应用程序服务器上的性能负荷的增长,系统资源会变得不足,并且响应时间或吞吐量会受到影响。面对该问题,软件设计者可以选择将服务器的业务逻辑处理和用户界面处理划分到单独计算机上的单独层上。实际上,应用程序服务器层将替换为两层,缓解了系统资源缺乏。

该问题并不是要设计三层应用程序。相反,它是要在应用程序部署以后增加层数。如果原始应用程序使用数据集以 ADO.NET 实现,则该转换很容易进行。请记住,当用两层替换单个层时,将安排这两层交换信息。由于这些层可以通过 XML 格式的数据集传输数据,所以通信相对较容易。

可编程性

Visual Studio 中的 ADO.NET 数据组件以不同方式封装数据访问功能,帮助您加快编程速度并减少犯错几率。例如,数据命令提取生成和执行 SQL 语句或存储过程的任务。

同样,由这些设计器工具生成的 ADO.NET 数据类导致类型化数据集。这又使您可以通过已声明类型的编程访问数据。例如,请考虑下面这行代码(它访问未声明类型的数据集内的数据成员):

 

C# 

复制代码

if (totalCost > (double)dataSet1.Tables["Customers"].Rows[n]["AvailableCredit"])

 

访问已声明类型的数据集内的数据成员的等效代码行如下所示:

C# 

复制代码

if (totalCost > dataSet2.Customers[n].AvailableCredit)

 

已声明类型的数据集的代码更易阅读。因为提供了语句结束,所以它还便于编写。例如,“AvailableCredit”在完成以下语句的选择列表中:

IftotalCost > dataSet2.Customers(n).

最后,已声明类型的数据集的代码更安全,原因在于它提供对类型的编译时检查。例如,假定AvailableCredit 表达为货币值。如果程序员误向 AvailableCredit 分配了字符串值,则环境会在编译时向程序员报告该错误。当使用未声明类型的数据集时,程序员直到运行时才会知道该错误。

性能

对于不连接的应用程序,ADO.NET 数据库提供的性能优于 ADO 不连接的记录集。当使用 COM 封送在层间传输不连接的记录集时,会因将记录集内的值转换为 COM 可识别的数据类型而导致显著的处理开销。在 ADO.NET 中,这种数据类型转换则没有必要。

可伸缩性

因为 Web 可以极大增加对数据的需求,所以可缩放性变得很关键。Internet 应用程序具有无限的潜在用户供应。尽管应用程序可以很好地为十几个用户服务,但它可能不能向成百上千个(或成千上万个)用户提供同样好的服务。使用数据库锁和数据库连接之类资源的应用程序不能很好地为大量用户服务,因为用户对这些有限资源的需求最终将超出其供应。

ADO.NET 通过鼓励程序员节省有限资源来实现可缩放性。由于所有 ADO.NET 应用程序都使用对数据的不连接访问,因此它不会在较长持续时间内保留数据库锁或活动数据库连接。

 

 

小结:

ADO.NET 包括哪两个主要的组件?

.NET 数据提供程序的四个核心对象是什么?