2024年3月21日发(作者:)

什么叫

是.NET FrameWork SDK提供给.NET开发语言进行数据库开发的一个系列类库的集

合。它可以有效地从数据操作中将数据访问分解为多个可以单独使用或前后使用的不连续组

件。

的组成

微软设计组件的目的是为了从数据操作中分解出数据访问。完成此任务的是

的两个核心组件。

.NET数据提供程序的在中的分类图

* .NET数据提供程序:实现数据操作和对数据的快速读写访问。

* DataSet数据集:在内存中的、有着丰富功能的数据缓冲区,是一个记录集的集合。

在Visual C# 2005中,.NET数据提供程序有以下5种:

* Microsoft OLE DB数据提供程序。

* Microsoft ODBC数据提供程序。

* Microsoft SQL Server数据提供程序。

* Oracle数据提供程序。

* 其他数据提供程序。

而每种.NET数据提供程序都包含了以下4种对象。

* Connection对象:提供与数据源的连接。

* DataAdapter对象:提供连接DataSet对象和数据源的桥梁。

* Command对象:提供对数据库命令的访问,这些命令可用于返回数据、修改数据、运行存

储过程、发送或检索参数信息。

* DataReader对象:从数据源中提供高性能的数据流。

DataSet数据集是的断开式结构的核心组件,它在与数据源断开的缓存中存储数据,

从而实现了独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,包括XML

数据源、远程的或本地的数据库。DataSet包含一个或多个DataTable对象的集合,每个

DataTable对象包含DataRow对象、DataColumn对象和Constraint对象,分别存放数据表

的行信息、列信息及约束信息。此外DataSet对象还包含DataRelation对象,用于表示表

间关系。它们的关系如图14-1所示。

图14-1 .NET数据提供程序和DataSet数据集结构图

连接数据库的过程

当应用程序需要连接数据库时,首先需要用Connection对象连接数据库,然后用Command

对象对数据库进行操作,Command对象的执行结果可以被DataReader对象读取,也可以被

DataAdapter对象用来填充DataSet对象。当DataReader读取时,只读一条数据,而

DataAdapter对象则把所有数据填充给DataSet。因此DataAdapter对象是DataSet对象与

数据库的桥梁。这个过程可以用图14-2表示。

图14-2 的结构图

的命名空间

命名空间

命名空间的核心内容是DataSet对象及相关的类,如表6-4所示。

命名空间的主要类

对 象 名 称

DataSet

DataTable

DataTableCollection

DataView

DataRow

DataRowCollection

DataRowView

DataColumn

DataColumnCollection

DataRelation

对 象 功 能

数据在内存中的缓存

内存中的数据表

内存中的DataTable集合

内存中某个DataTable的视图

DataTable中的某行数据

DataTable中行的集合

DataRow的视图

DataTable的列结构

某个DataTable对象的DataColumn集合

两个DataTable之间的关系

DataRelationCollection DataSet中所有的DataRelation对象的集合

Constraint

ConstraintCollection

DataTableReader

DataColumn对象上的约束

某个DataTable上所有的Constraint对象的集合

以一个或多个只读、只进结果集的形式获取N个

DataTable 对象的内容

DataException

使用时发生的意外

命名空间

命名空间的核心内容是各种 .NET Framework 数据提供程序共享的类,

如表6-5所示。

命名空间的主要类

对 象 名 称

DataAdapter

对 象 功 能

一组SQL 命令和一个数据库连接,用于填充 DataSet 和更新

数据源

DbCommand

DbConnection

DbDataAdapter

DbDataReader

DbException

DbParameter

DbTransaction

命名空间

命名空间的核心内容是基于ODBC接口可以访问的数据源的数据提供程

序。目前主流的关系型数据库、文本文件、Excel电子表格文件等都支持ODBC接口。命名

空间的主要内容如表6-6所示。

命名空间的主要类

对 象 名 称

OdbcCommand

OdbcConnection

对 象 功 能

对数据源执行的 SQL 语句或存储过程

连接数据源

表示要对数据源执行的 SQL 语句或存储过程

表示到数据库的连接

继承DataAdapter的大部分功能

从数据源返回只读的、向前的数据

数据源引发的异常

为DbCommand对象设置参数

事务

OdbcDataAdapter 数据命令集和到数据源的连接,它们用于填充 DataSet 以及

更新该数据源

OdbcDataReader

OdbcError

OdbcException

OdbcParameter

OdbcTransaction

从数据源提取只读、向前的数据

从数据源返回的错误或者警告信息

数据源引发的异常

设置OdbcCommand对象的参数

设置事务

命名空间

命名空间的核心内容是基于OLEDB接口可以访问的数据源的数据提供程

序。命名空间的主要内容如表6-7所示。

命名空间的主要类

对 象 名 称

OleDbCommand

OleDbConnection

对 象 功 能

对数据源执行的 SQL 语句或存储过程

连接数据源

OleDbDataAdapter 数据命令集和到数据源的连接,它们用于填充 DataSet 以及

更新该数据源

OleDbDataReader

OleDbError

OleDbException

对 象 名 称

OleDbParameter

对 象 功 能

设置OleDbCommand对象的参数

从数据源提取只读、向前的数据

从数据源返回的错误或者警告信息

数据源引发的异常

OleDbTransaction 设置事务

Client命名空间

Client命名空间的核心内容是专为Oracle数据库设计的数据提供程

序。命名空间的主要内容如表6-8所示。

Client命名空间的主要类

对 象 名 称

OracleCommand

OracleConnection

对 象 功 能

对数据源执行的 SQL 语句或存储过程

连接数据源

OracleDataAdapter 数据命令集和到数据源的连接,它们用于填充 DataSet 以及

更新该数据源

OracleDataReader

OracleError

OracleException

OracleParameter

从数据源提取只读、向前的数据

从数据源返回的错误或者警告信息

数据源引发的异常

设置OracleCommand对象的参数

OracleTransaction 设置事务

ent命名空间

ent命名空间的核心内容是专为SQL Server数据库设计的数据提供程

序。命名空间的主要内容如表6-9所示。

ent命名空间的主要类

对 象 名 称

SqlCommand

SqlConnection

对 象 功 能

对数据源执行的 SQL 语句或存储过程

连接数据源

SqlDataAdapter 数据命令集和到数据源的连接,它们用于填充DataSet,以及

更新该数据源

SqlDataReader

SqlError

SqlException

SqlParameter

SqlTransaction

从数据源提取只读、向前的数据

从数据源返回的错误或者警告信息

数据源引发的异常

设置SqlCommand对象的参数

设置事务

verCe命名空间

verCe命名空间的核心内容是 2.0中专为SQL Server Mobile

数据库设计的数据提供程序。命名空间的主要内容如表6-10所示。

verCe命名空间的主要类

对 象 名 称

SqlCeCommand

SqlCeConnection

对 象 功 能

对数据源执行的 SQLCE 语句或存储过程

连接数据源

SqlCeDataAdapter 数据命令集和到数据源的连接,它们用于填充DataSet,以及

更新该数据源

SqlCeDataReader

SqlCeError

SqlCeException

SqlCeParameter

从数据源提取只读、向前的数据

从数据源返回的错误或者警告信息

数据源引发的异常

设置SqlCeCommand对象的参数

SqlCeTransaction 设置事务

显示了命名空间的结构。

图14-3 命名空间的结构

中的类

中的类很多,从一次数据库访问过程看,一般需要4个或5个类,它们的顺序如图

14-4所示。

图14-4 数据库访问中类的顺序

在使用这些类时,除了基础类DataSet外,其他类的数据提供程序要一致,如SQLConnection、

SQLCommand、SQLDataReader是一致的,OLEDbConnection、OLEDbCommand、OLEDbDataAdapter

是一致的。

如何使用

处理数据库数据一般需要4个步骤。

1.使用Connection连接数据库

处理数据库数据的第一步是连接到数据库,只有先连接上数据库才能进行后续操

作。该步骤用到Connection对象,该对象负责建立和控制用户应用程序与数据库之间的连

接。一个Connection对象表示到数据源的一个唯一的连接,在客户端-服务器(即C/S)数

据库系统中,它等效与一个到服务器的网络连接。

所有的连接都要用到连接字符串ConnectionString,该字符串是使用分号隔开的多项信息,

其内容随着数据库类型和访问内容的变化而变化。不同的数据库有着不同内容的连接字符

串,下面就列举两种常用数据库的连接字符串:Access和SQL Server。

1)Access数据库连接字符串

在连接Access数据库时,Provider和Data Source是必须要设置的参数,其他参数可以根

据情况省略。

SQL Server数据库连接字符串:

使用Connection对象连接数据库的方法一般如下(SQL Server数据库):

2.执行数据库命令

执行数据库命令由Command对象完成,它的任务就是执行SQL语句,然后把执行的结果传给

下一级对象:DataAdapter或DataReader对象。它有3种执行方式:ExecuteNonQuery、

ExecuteReader、ExecuteScalar。在定义Command对象时,一般要有Connection对象支持,

基本用法如下:

3.读取数据

Command对象执行后,由数据读取对象DataReader和数据匹配对象DataAdapter接收数据,

DataReader对象里的数据可以直接为应用程序使用,而DataAdapter对象则建立和初始化

数据表,然后填充给DataSet对象为应用程序使用。

Command对象通过执行ExecuteReader方法就可将数据传给DataReader对象,这在上一步

骤的例子中已经说明,如下:

Command对象将数据传给DataAdapter对象的方法是要通过DataAdapter对象的

SelectCommand、DeleteCommand、UpdateCommand、InsertCommand属性进行传递;而

DataAdapter对象向DataSet对象传递数据则需要Fill方法,具体方法如下:

4.对数据进行处理

读取数据时有3种方法:使用DataReader对象读取;使用DataAdapter对象读取数据再传

给DataSet对象,然后再处理;使用Command对象直接修改数据库。

1)用DataReader对象读取数据源

DataReader对象用于从数据库中读取由SELECT命令返回的只读、只进的数据流,它仅对数

据库检索的数据提供向前的只读指针。采取这种方式每次处理时在内存中只有一行内容,所

以不仅提高了应用程序的性能,还有助于减少系统的开销。在下列情况下,要在应用程序中

使用DataReader:

不需要缓存数据。

要处理的结果集太大,内存中放不下。

一旦需要以仅向前、只读方式快速访问数据。

使用DataReader的基本过程是:首先要建立与数据库的连接,然后设定好Command对象并

执行SQL命令,以连接SQL Server 2000为例,因此要定义一个SqlDataReader对象来接收

Command对象执行ExecuteReader方法的返回数据集。然后就可以调用DataReader的

GetValue或者GetInt32等方法来获取某列的值了。如果需要读取下一条数据,使用

DataReader对象的Read方法。最后,调用Close方法关闭DataReader对象。

2)使用DataSet对象读取数据源

由于DataReader对象仅仅用于从数据库中读取数据,因此修改数据库时不使用该对象。对

数据进行处理,尤其是当需要修改数据时,往往使用DataSet对象。

DataSet的结构和关系型数据库很类似,具有表、行、列等属性。主要用于在内存中存放数

据,可以一次读取整张数据表的内容。其基本结构如图14-5所示。

使用DataSet对象必须要有一个可以建立初始化数据的对象,即DataAdapter对象。DataSet

对象可以存放DataAdapter对象执行工作后所取得的数据。它也是一个集合对象,有许多

DataTable对象组成,应用程序可以通过DataTable对象和DataTable对象内的Column对

象(列数据对象)、Row对象(行数据对象)的操作读取数据。下面简要介绍这几种对象的

常用属性集方法。

DataTable对象的常用属性及常用方法如下。

TableName属性:对象名称。

Rows属性:对象中的记录集合。

Name属性:数据表的名称。

Column属性:对象中的字段集合。

NewRow方法:增加一条记录。

Clear方法:清除所有数据。

Column对象的常用属性及常用方法有。

Count属性:DataTable(数据表)对象中的字段数。

DataType属性:该列的数据类型。

ColumnName属性:该列的名称。

AllNull属性:该表字段是否接受空值。

Row对象的常用属性及常用方法有。

RowState属性:行对象的状态。

ItemArray属性:以数组方式读取行内数据。

Item():读取行内的数据,如Item(2),就是读取第3个数据。

使用DataSet对象读取数据的方法一般如下:

除了可以进行数据查询外,使用DataSet还可对数据库进行添加、删除和修改等操作,修改

以后的数据可以被接受,也可以不被接受,即取消修改。

在用DataSet对象处理数据时,根据不同的情况对数据进行查询、修改、删除等操作。

① 修改:当修改某一条记录中的某一个数据时,首先对DataRow对象使用BeginEdit()方

法,表示要对该行进行编辑操作,在编辑中禁止约束检查,然后编辑,修改数据,最后使用

EndEDit()方法,结束编辑,把编辑的结果通过DataSet传给数据库。具体代码如下:

② 添加:当需要为某一个记录表添加一行数据时,首先调用DataTable对象的NewRow()方

法,创建一个新的空行,然后对该行中的每一个字段进行必要的赋值,最后调用DataRow

对象的Add()方法将该行添加到表中。具体代码如下:

③ 删除:当需要删除表中的某一行数据时,调用DataRow对象的Delete()方法来实现,也

可以调用DataRowCollection的Remove()方法。Remove方法是从DataRowCollection中删

除DataRow对象;而Delete()方法只是将该行的标记删除,在数据库中并没有删除。当应

用程序调用AcceptChanges()方法时,才会发生实际上的删除。通常是使用DataRow对象的

Delete()方法。具体代码如下:

④ 保存:当接受了数据的修改后,如果想保存到数据库,则需要调用DataAdapter对象的

Update()方法。这些更改是用SQL语句发回到数据库的,必须要用一个Command对象来执行

SQL语句,所以一般在创建DataAdapter对象后就创建一个Command对象。具体代码如下:

3)使用Command直接修改数据

在这里常用的两个Command对象的方法是ExecuteScalar()和ExecuteNonQuery()。

ExecuteScalar()方法主要用于SELECT语句查询,它不对数据库进行更改,有返回值。

ExecuteNonQuery()方法可以执行SQL语句中的更新(UPDATE)、删除(DELETE)、添加(INSERT)

命令,它不带有返回值。其用法如下:

其他的数据操作也可以用ExecuteNonQuery()方法进行操作。

对数据库的访问

1.断开式数据库访问连接

技术中,最重要的一条就是采用断开式数据库访问连接。所谓断开式数据库访问连

接就是指客户端从数据源获取数据后,断开与数据源的连接,所有的数据操作都是针对本地

数据缓存里的数据,当需要从数据源获取新数据或者被处理后的数据回传,这时客户端再与

数据源相连接来完成相应的操作。断开式数据库访问连接最为核心的对象是DataSet对象,

一旦通过数据适配器将数据填充至DataSet对象后,则今后的数据访问将直接针对DataSet

对象展开。具体过程可以参照图4-7来理解.

首先,数据适配器(DataAdapter对象)选择连接和命令从数据库获取数据(Connection

对象),通过填充操作将数据装载到数据集(DataSet对象);然后,数据集作为WinForm程

序控件的“数据源”,通过数据绑定控件使数据集中的数据与WinForm程序控件中的数据保

持一致。这时客户端使用的数据,在填充那一刻就已经被缓存了。用户通过WinForm应用程

序操作的数据都是针对本地缓存里的数据进行的。当数据被修改后需要回传,再通过数据适

配器重新连接数据库,将数据保存在数据库内。这里需要注意点是:将数据传递到用户界面

时,采用XML格式。

图4-7 断开式数据库访问示例图

2.连线式数据库访问连接

技术中,另一种数据库访问连接方式就是连线式数据库访问连接。所谓连线式数据

库访问连接就是指客户端从数据源获取数据后,通过DataReader对象一条一条的从数据源

之中将访问到的数据行读取到客户端的过程,在这种只读前进式的数据访问读取过程中,

DataReader对象必须时刻与数据源保持连接,因此这种方式访问数据库的特点是:在前进

只读方式访问数据表时候其效率较高。具体过程可以参照图4-8来理解。

图4-8 连线式数据库访问示意图

操控数据库的主要对象包括:Connection对象,Command对象,DataReader

对象,DataAdapter对象。表4-1概括了组成 .NET Framework 数据提供程序的四个核心

对象。

表4-1 .NET数据提供程序的四个核心对象表

对象

Connection

Command

说明

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

对数据源执行命令。公开Parameters,并且可以通过Connection在

Transaction的范围内执行。所有Command对象的基类均为DbCommand类。

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

DbDataReader类。

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

DbDataAdapter类。

除表4-1列出的核心对象之外,.NET Framework 数据提供程序还包含4-2表列出

的其他重要对象。

表4-2 .NET数据提供程序的其他对象表

对象

Transaction

说明

使您能够在数据源的事务中登记命令。所有Transaction对象的基

类均为DbTransaction类。

CommandBuilder 帮助器对象将自动生成DataAdapter的命令属性或将从存储过程

派生参数信息并填充Command对象的Parameters集合。所有

CommandBuilder对象的基类均为DbCommandBuilder类。

ConnectionStringBuilder 帮助器对象为创建和管理Connection对象所使用的连接字符串的

内容提供了一种简单的方法。所有ConnectionStringBuilder对象

的基类均为DbConnectionStringBuilder类。

Exception 在数据源中遇到错误时返回。对于在客户端遇到的错误,.NET

Framework数据提供程序会引发.NET Framework异常。所有

Exception对象的基类均为DbException类。

Error

ClientPermission

公开数据源返回的警告或错误中的信息。

为.NET Framework数据提供程序代码访问安全属性。所有

ClientPermission对象的基类均为DBDataPermission类。

另外,.NET数据提供程序的命名空间有四类,前面提到的这些对象在每类数据提供程序的

命名空间里都有一套,并且某个对象在不同的命名空间内名称是不同的。四类命名空间分别

是:SQLClient、OLEDB、Oracle、ODBC,其对应的数据提供程序如表4-3所示:

表4-3 四类.NET数据提供程序表

.NET Framework 数据提供

程序

SQL Server .NET 提供对Microsoft SQL Server 7.0版或更高版本的数据访问。

说明

Framework数据提供程序 使用ent命名空间。

建议用于使用Microsoft SQL Server 7.0或更高版本的中间层

应用程序,Microsoft数据库引擎(MSDE)或SQL Server 7.0或

更高版本的单层应用程序。

建议将用于SQL Server的OLE DB提供程序(SQLOLEDB)与OLE

DB .NET Framework数据提供程序一起使用。对于SQL Server

6.5版和较早版本,必须将用于SQL Server的OLE DB提供程

序与OLE DB .NET Framework数据提供程序一起使用。

OLE DB .NET Framework数

据提供程序

适合于使用OLE DB公开的数据源。使用

命名空间。

建议用于使用SQL Server 6.5或较早版本的中间层应用程序。

对于SQL Server 7.0或更高版本,建议使用SQL Server .NET

Framework数据提供程序。还建议用于使用Microsoft Access

数据库的单层应用程序。不建议将Access数据库用于中间层应

用程序。

ODBC .NET Framework数据

提供程序

适合于使用ODBC公开的数据源。使用命名

空间。

建议用于使用ODBC数据源的中间层和单层应用程序。

Oracle .NET Framework数

据提供程序

适用于Oracle数据源。Oracle .NET Framework数据提供程序

支持Oracle 客户端软件 8.1.7 版和更高版本,使用

Client命名空间。建议用于使用Oracle

数据源的中间层和单层应用程序。

每一类数据提供程序的命名空间里都有一套对象,它们是通过前缀名进行区别的,例如:

SQLClient命名空间包含的对象有:SqlConnection、SqlCommand、SqlDataReader、

SqlDataAdapter等,OLEDB命名空间包含的对象有:OleDbConnection、OleDbCommand、

OleDbDataReader、OleDbDataAdapter等。

1.操控数据库的工作过程

.NET数据提供程序的工作过程如图4-12所示:

.NET数据提供程序的工作过程图

在图4-12中1,2,3步骤是从服务器检索数据的过程,A、B是对数据库修改的过程。在这

个过程中1、2步和B过程都是.NET数据提供程序的工作步骤。

2.与MS SQL Server的关联

由于架构在.NET Framework 2.0基础之上的VS2005软件开发系统平台与SQL Server数据

库管理信息系统都是出自微软公司旗下产品,所以VS2005与SQL Server的数据通信本身就

已经经过了优化,可以直接访问SQL Server而不用添加OLE DB或开放式数据库连接(ODBC)

层,并具有良好的性能。

以下代码示例显示如何在应用程序中包含ent命名空间。

using ent;

注意:

ODBC .NET Framework数据提供程序的结构与OLE DB .NET Framework数据提供程序的结构

相似;例如,它调入ODBC服务组件。

3.与OLEDB的关联

OLEDB是Microsoft的一个战略性系统级编程接口,用于管理整个组织内的数据。OLEDB 是

建立在ODBC功能之上的一个开放规范,主要用于访问非关系型数据库。表4-4显示已经用

进行测试的提供程序。

表4-4 OLEDB数据提供程序所对应的数据源驱动程序表

驱动程序

SQLOLEDB

MSDAORA

.4.

0

OLE DB .NET Framework数据提供程序类位于命名空间中。以下代码示

例显示如何在应用程序中包含命名空间。

using ;

注意:

不推荐将Access (Jet)数据库用作多线程应用程序(如应用程序)的数据源。如

果必须将Access数据库用作应用程序的数据源,而且不能使用其他数据库(如SQL

Server或MSDE),那么请注意,连接到Access数据库的应用程序可能会遇到连接

问题,这些问题通常与安全权限有关。

4.与ODBC的关联

DSN(数据源)是在odbc里设置的,用于连接数据库,ODBC只能用于关系型数据库。作为DSN

的数据库连接可分为以前三种:

n 用户DSN:数据源对计算机来说是本地的,并且只能被当前用户访问,所以只有建立

该数据源的用户才能访问该数据源,而且不能从网络上访问该数据源。

提供程序

用于SQL Server的Microsoft OLE DB提供程序

用于Oracle的Microsoft OLE DB提供程序

用于Microsoft Jet的OLE DB提供程序

n 系统DSN:数据源对于计算机来说也是本地的,但并不是用户专用的,任何具有权限

的用户都可以访问“系统DSN”,但是它还是不能从网络上来访问。

n 文件DSN:则与前两者不同,它们可以在所有安装了相同驱动程序的用户中共享,这

些数据源对于计算机说都是本地的。也就是说可以通过网络上来访问。

表4-5显示了用测试的ODBC驱动程序。

表4-5 ODBC数据提供程序所对应的数据源驱动程序表

驱动程序

SQL Server

Microsoft ODBC for Oracle

Microsoft Access 驱动程序 (*.mdb)

ODBC .NET Framework数据提供程序类位于命名空间中。以下代码示例

显示如何在您的应用程序中包含命名空间。

using ;

5.与Oracle的关联

提供程序通过Oracle客户端连接软件启用对Oracle数据源的数据访问,该数据提

供程序支持Oracle客户端软件8.1.7版或更高版本。

为与Oracle数据库关联提供程序类位于Client命名空间中,

并包含在程序集中。在编译使用该数据提供程序的应用程

序时,需要同时引用和。

以下代码示例显示如何在您的应用程序中包含Client命名空间。

using ;

using Client;