第6章 ASP.NET数据管理
我们知道,数据信息是任何信息系统的核心部分,是信息系统的支撑。因此,我们日常开发的大部分应用程序都是围绕读取和更新数据库中的这些数据信息来进行操作的,无论桌面应用程序还是Web应用程序,都是如此。
面对这些复杂的数据处理任务,.NET Framework提供了自己的数据库访问技术—ADO.NET技术。ADO.NET是一组向.NET Framework程序员公开数据访问服务的类,它为创建分布式数据共享应用程序提供了一组丰富的组件,它提供了对关系数据、XML和应用程序数据的访问。因此,它也是.NET Framework中不可缺少的一部分。同时,ADO.NET还支持多种开发需求,包括创建由应用程序、工具、语言或Internet浏览器使用的前端数据库客户端和中间层业务对象。
6.1 ADO.NET概述
简单来讲,ADO.NET作为.NET Framework的一部分,它由一组工具和层组成,应用程序可以借此与基于文件或基于服务器的数据存储很轻松地进行通信和管理。下面将全面阐述ADO.NET技术。
6.1.1 ADO.NET数据提供程序
有过ASP编程经验的读者或许知道,在早期的ADO技术中,无论什么数据源,我们总是使用一组相同的对象来处理这些数据。例如,使用ADO技术从Oracle数据库中读取一行记录,会使用Connection对象来连接数据库;假如再使用ADO技术从SQL Server数据库中读取一行记录时,同样也会使用Connection对象来连接数据库。
在ADO.NET技术中,它改变了ADO的这种统一处理不同的数据源的方式。针对不同的数据源,ADO.NET使用了不同的数据提供程序模型来进行相关处理,可以使用图6-1来描述这种处理方式。
其中,无论什么数据提供程序,它都是用于连接到数据库、执行命令和检索结果的一组特定的ADO.NET类,如表6-1所示。
图 6-1 ADO.NET数据提供程序
可以将这些数据提供程序看做应用程序和数据源之间的一座桥梁,而我们只需要简单地使用这些数据提供程序就可以操作各种数据源。并且,这些数据提供程序是轻量级的,它在数据源和代码之间创建最小的分层,并在不降低功能性的情况下提高性能。
注意 当选择数据提供程序的时候,首先应当使用特定数据源定义的数据提供程序。如果没有找到,则可以使用OLE DB数据提供程序。OLE DB技术已经存在了很多年,许多数据源都支持OLE DB驱动程序,包括SQL Server、Oracle、Access、MySQL等。在很少的情况下,如果没有找到.NET的数据提供程序或者OLE DB驱动程序,则可以使用ODBC数据提供程序,不过ODBC数据提供程序要和ODBC驱动程序一起使用。
这里还需要特别注意的是,在.NET Framework 4以后的版本中,System.Data.OracleClient将不被支持。但System.Data.OracleClient在.NET Framework 4中仍然可用,并不会有任何功能限制。但在开发和编译时,会出现大量的警告信息。
其实,ADO.NET的这种数据提供程序模型的一个重要的基本思想就是扩展性。在某些特殊的环境下,开发人员可以为私有的数据源创建自己的数据提供程序。其方法也很简单,只需要继承相应的基类,实现相应的接口集即可。如MySQL数据库也提供了自己数据提供程序MySql.Data.dll,引入该程序集之后,只需要加入MySql.Data.MySqlClient命名空间就可以操作MySQL数据库了。
6.1.2 ADO.NET数据提供程序的核心对象
简单地讲,ADO.NET提供了一个松散的模型,因为它并没有对多种数据源提供一个通用的对象。其结果是,如果需要从一个数据库改变到另一个数据库,则需要使用不同的类,并修改底层数据访问代码。即使不同的.NET数据提供程序使用了不同的类,但是所有的提供程序都是按照相同的方式进行了标准化处理。而且,每个数据提供程序都是基于相同的接口集和基类。例如,在SQL Server数据提供程序的SqlConnection类中,SqlConnection类是从DbConnection类继承而来,而DbConnection类又实现了IDbConnection接口。同样,Oracle数据提供程序OracleConnection类也是从DbConnection类继承而来。因此,每个Connection对象都实现了IDbConnection接口,所不同的是,它们各自定义了自己的核心实现方法,如Open()和Close()等。
这种标准化处理保证了每个Connection类能够以相同的方式工作,且提供相同的核心属性和方法集。在此基础上,每种数据提供程序又进行了一些优化处理,每种数据提供程序使用了完全不同的底层调用和API。例如,SQL Server数据提供程序使用了TDS(表格式数据流)协议同服务器进行通信。这种模型的优点并不是非常直观,主要有如下两点:
1)每种数据提供程序都使用了相同的接口和基类,因此,同样可以编写一些通用的访问代码(这一点会在后面具体讲解)。
2)由于每种数据提供程序分别相互独立实现,所以可以有针对性地做相应的优化。例如,对于SQL Server数据库提供程序,它支持执行XML查询的机制。
如上所述,虽然ADO.NET技术并没有包含一个通用的数据源提供程序对象。但每种数据提供程序都对Connection、Command、DataReader和DataAdapter核心对象提供了特定的实现,并进行了相应的优化,如表6-2所示。例如,如果需要创建同SQL Server数据库的连接,则可以使用SqlConnection连接类。
6.1.3 ADO.NET基本类库
目前,ADO.NET支持两种类型的对象:基于连接的对象和基于内容的对象,如图6-2所示。
1)基于连接的对象。它们是数据提供对象,如Connection、Command、DataReader和DataAdapter。它们连接到数据库,执行特定的SQL语句和存储过程,遍历结果集或者填充数据集((DtaSet)。这类对象主要是针对具体数据源类型的,可以在数据提供程序指定的命名空间中找到,如Oracle数据提供程序的System.Data.OracleClient命名空间。
图 6-2 .NET Framework数据提供程序和DataSet之间的关系
2)基于内容的对象。这类对象与基于连接的对象不一样,它们属于非连接的、断开的,主要包括DataSet、DataColumn、DataRow、DataRelation等。它们完全和数据源独立,可以在System.Data命名空间中找到它们。
其实,在.NET Framework框架中,所有的ADO.NET类库都位于System.Data命名空间下。这些类库包括连接到数据源、执行SQL命令以及存储过程、操作和获取数据等功能。常用的ADO.NET命名空间如表6-3所示。