ADO-NET总论
 
2009-04-17 来源:gzdzw.51.net
 

ADO.NET是.Net 用以操作数据库的类库总称。它是.NET应用软件对数据库操作的软件技术。

ADO.NET由二大部分组成:

1、数据提供者(Data Provider)

2、数据集(DataSet)

一、数据提供者(Data Provider)

ADO.NET的一个核心成员--数据提供者(Data Provider)或称托管提供者(Managed Provider)是一个类集,它可以认为是数据库与应用程序的一个接口件或中间件。由于现在使用的数据源有多种(SQL Server、OLE DB 、ODBC 、Oracle),在编写应用程序的时候就要针对不同的数据源编写不同的接口代码,这很麻烦,效率也不高,针对这一问题Data Provider向上(应用程序)提供了统一的编程界面,向下(数据源)提供了多种数据源的接口,这样一来就可使应用程序不需关心什么数据源,即对数据源进行了屏蔽,其好处是无论什么样的数据源,对于应用程序来说只提供一种编程模式即可。

针对不同的数据源,Data Provider使用不同的类。对于OLE DB 数据源,其使用的类是:OleDbDataAdapter、OleDbDataReader、OleDbCommand 和OleDbConnection 类,其命名空间是System.Data.OleDb;对于SQL Server数据源,其使用的类是:SqlDataAdapter、SqlDataReader、SqlCommand 和 SqlConnection 类,其命名空间是System.Data.SqlClient。

Data Provider分为四个部分:

1、连接(Connection)

2、Command

3、数据适配器(DataAdapter)

4、DataReaders

①、连接(Connection)

要使用数据库,首先就是要在应用程序与数据库间建立一条连接通道,这个工作就是由Connection类来完成。

例一:(以数据源是SQL Server为例)

sting cs="Data Source=数据库服务器名;user id=登陆名;password=登陆密码;Initial Catalog=数据表名称"; //创建连接参数

SqlConnection myConnection = new SqlConnection(cs); //创建一个SqlConnection实例

myConnection.Open();//打开连接

......

......

myConnection.Close(); //断开连接

②、Command

Command的作用主要是把一条SQL语句解释成一个命令对数据库进行相关的操作(插入、查询、更新、删除等)。

针对不同的数据源,Data Provider提供了不同Command类,如针对SQL Server数据源提供了SqlCommand类、针对OLE DB数据源提供OleDbCommand类,这些类的结构是一样的。主要有三种常用的方法:ExecuteReader、ExecuteNonQuery、ExecuteScalar,这些方法必需是带参数的。

ExecuteReader方法:解释SQL语句并以命令方式执行。为了提高性能,ExecuteReader还可使用Transact-SQL、sp_executesql、系统存储过程的调用命令。

ExecuteNonQuery方法:执行Transact-SQL INSERT、DELELE、UPDATE及SET语句等命令。

ExecuteScalar方法:从数据库中实现单个字段的检索。

③、数据适配器(DataAdapter)

不同的数据源对应不同的DataAdapter。

DataAdapter插在DataSet与数据库之间,形成了DataSet与数据库的桥梁,通过它从数据库中的数据信息填充到DataSet中,又是通过它并以DataSet为桥梁来完成我们对数据库的插入、查询、更新、删除等操作。

对数据库的操作是采用结构化的SQL语句通过命令方式进行的。

DataAdapter类的核心由四个属性和两个方法组成。

  • 属性是:

a、SelectCommand

b、InsertCommand

c、UpdateCommand

d、DeleteCommand

SelectCommand是一条查询属性;InsertCommand是一条数据插入属性;UpdateCommand是一条数据更新(修改)属性;DeleteCommand是一条数据删除属性。这些属性都是为DataSet提供数据插入、查询、更新、删除的操作服务。

  • 方法是:

1、Fill方法

2、Update方法

Fill的作用是把数据库的数据填充到DataSet中;

Update方法是用作对DataSet中的数据进行插入、更新、删除的操作。

它的操作过程是这样的,在Update的过程中,先根据操作的需要把DataAdapter的属性设置为一条相应的SQL操作语句(或储存过程调用语句),然后通过使用SqlCommand类中的ExecuteReader方法或ExecuteNonQuery方法把SQL语句以命令形式执行,而这个过程是隐式进行的。

例二:以SelectCommand,数据源为SQL Server为例:数据库服务器名是:liusw,数据库名是:gzdzw,数据表名是:gzdzw

string cs="Data Source=liusw;user id=sa;password=821226;Initial Catalog=gzdzw";

//设置一个连接字串

string C="SELECT * FROM gzdzw";//设置一个SQL命令字串

SqlConnection A = new SqlConnection(cs);/生成一个连接实例

A.Open();//打开连接

SqlCommand B = new SqlCommand (C,A);//生成一个SQL命令

SqlDataAdapter D = new SqlDataAdapter( ) ;

 //创建SQL数据提供者的一个实例(建立一个SQL操作接口)

D.SelectCommand =B;//对数据库进行查询

DataSet ds = new DataSet ( ) ;//创建一个DataSet实例

D.Fill ( ds , "gzdzw" ) ; //使用Fill方法填充数据到DataSet

DataGrid1.DataSource = ds; //把数据来源设置到DataGrid的属性项DataSource里

DataGrid1.DataBind();//执行绑定(即将数据填充进DataGrid里)

A.Close();//关闭连接

使用控件DataGrid的目的是把查询的结果以列表的方式显示在屏幕上。WEB页面代码如下:

④、DataReader

ADO.NET提供了一个DataSet对象(下面要讲到),用于检索数据库并将数据存储在内存中。但如果访问的数据量很大,那么就不适宜使用DataSet了,此时我们要使用的是DataReader类。DataReader提供一个对数据库进行快速、只进、只读数据流访问方式。

DataReader每次只读取数据源一列的数据储存到内存中,所以读取数据的执行效率非常的高。

DataReader每运行完一条命令仅返回一个只读记录集。

对于下列情况,要在应用程序中使用 DataReader:

a、不需要缓存数据。

b、要处理的数据集太大,内存中放不下。

c、一旦需要以只进、只读方式快速访问数据。

在DataReaders工作方式下,对数据的各种操作命令是采用直接调用Command 类提供的ExecuteReader、ExecuteNonQuery、ExecuteScalar三种方法。这些方法的区别仅在于使用它们时所用的参数类型及其执行后所返回的不同结果。我们可根据自己需要执行后的结果要求来确定要使用那个方法,相当简单。

例三:我们运行一条查询命令(使用SQL Server数据源),可使用ExecuteReader命令。

string cs="Data Source=liusw;user id=sa;password=821226;Initial Catalog=gzdzw";

string C="SELECT * FROM gzdzw";

SqlConnection A = new SqlConnection(cs);

A.Open();

SqlCommand B = new SqlCommand (C,A);

DataGrid1.DataSource = B.ExecuteReader();

//把数据填充到DataGrid的里,DataSource是DataGrid的一个数据填充属性(这里使用ExecuteReader命令)

DataGrid1.DataBind();//执行绑定(将数据绑定在DataGrid)         

A.Close();//关闭连接

使用 DataReader

下面是一些使用 DataReader时的注意问题。

a、如果在使用带参数的Command前,必须关闭DataReader。

b、完成读取数据之后一定要关闭DataReader。

c、不能在层之间远程访问 DataReader。DataReader 是为已连接好的数据访问设计的。

d、当访问数据表的列数据时,要使用类型化访问器(如GetString、GetInt32等)。这样的好处是不用将GetValue返回的Object强制转换成特定类型所需的处理。

e、 一个单一连接每次只能打开一个DataReader。如果想在相同的数据存储区上同时打开两个DataReaders,就必须显式创建两个连接,每个 DataReader一个。

f、默认情况下,DataReader每次在读数据时都要把整行加载到内存,这能在当前数据行内随机访问数据列。如果不需要这种随机访问,为了提高性能,可把CommandBehavior.SequentialAccess传递给ExecuteReader调用。这样将改变DataReader的默认行为,使它仅在请求时才把数据加载到内存。

g、如果已经完成读取来自DataReader的数据,但仍然有大量挂起的未读结果的时候,此时如要关闭DataReader之前先要取消Command。因为取消Command可使服务器放弃这些结果,从而释放服务器的资源。

图1是ADO.NET的总体结构简图

图1

二、数据集(DataSet)

DataSet是ADO.NET中最核心的成员之一,是各种开发基于.Net平台程序语言(如VB.NET、C#.NET、C++.NET)开发数据库应用程序最常接触的类,这是因为DataSet在ADO.NET实现从数据库中抽取数据的作用。数据抽取后,DataSet就是数据的存放地,它是各种数据源(SQL Server 、OLE DB等)的数据在计算机内存的缓存,所以有时说DataSet可以看成是一个数据容器(又称数据集)。在客户端通过对DataSet的数据集读取、更新等操作,从而实现对数据源的同等操作。

DataSet的最大优点是离线(断开)和连接。DataSet既可以以离线方式,也可以以实时连接来操作数据库中的数据。这样的好处是大大减少了服务器端数据库的连接线程,从而大大地减少了服务器端的运行压力。所以,在数据量不大的情况下,使用DataSet是最好的选择。

DataSet的基本工作过程为:应用程序一般并不直接对数据库进行操作(直接在程序中调用存储过程等除外),而是先完成和数据库的连接,接着通过数据适配器(DataAdapter)把数据库中的数据填入DataSet对象,然后客户端再通过读取DataSet来获得需要的数据,同样,在更新数据库中数据时,也是首先更新DataSet,然后再通过DataSet和数据适配器将更新数据的数据同步地解释入数据库中。图2是DataSet的结构图

图2

每一个DataSet是一个或多个DataTable 对象的集合(DataTable相当数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(column name)、数据格(Item)以及约束(constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序(DataView)信息组成。

DataView是用来在观察数据时提供排序和过滤的功能。

DataColumn是用来对表中的数据值进行一定的规限。比如那一列数据的默认值是什么;那一列数据值的范围是什么;那个是主键;数据值是否是只读等。

由于一个DataSet可能存在多张表,那么这些表可能存在关联关系,为此用parentRelations和childRelations来表述。ParentRelations表是父表,childRelations是子表,子表是对父表的引用,这样就使得一个表中的某行与另一个中的某一行甚至整个表相关联。

DataSet中的数据是通过DataAdapter的Fill方法填充进来的,如例二。

当要对数据库的数据进行插入、查询、更新、删除等操作时,首先是对DataSet内的数据进行操作,使用DataAdapter的Update方法实现对DataSet中数据的更新来达到对数据库的数据更新。

当DataSet实例中的数据发生更改后,此时调用Update方法,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE),并以此命令来更新数据库中的数据。实现过程已在上面说过。

例四:使用DataAdapter对象操作DataSet实现删除数据库中的某数据的具体实现方法(继承例二):

SqlCommandBuilder sqlCommandBuilder1 = new SqlCommandBuilder ( sqlDataAdapter1 ) ;

//创建sqlCommandBuilder实例,并以sqlDataAdapter1为参数来初始化SqlCommandBuilder实例

dsDataSet1.Tables["Customers"].Rows[0].Delete ( ) ;

//删除DataSet中的数据表(Customers是表名)的第一行数据(Rows[0]表示第一行)

sqlDataAdapter1.Update ( dsDataSet1 ,"Customers" ) ;

//调用Update方法,以DataSet中的数据对数据库进行更新。

dsDataSet1.Tables["Customers"].AcceptChanges ( ) ; 

图3是整个ADO.NET系统的运作图。

图3

最后,数据在用户终端的显示是通过在页面上调用Repeater、DataList、DataGid这几个控件(命名空间为:System.Web.UI.WebControls),将数据绑定到这些控件上,通过HTML表现出来。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织