r语言hist横轴:14.2.1 ADO.NET

来源:百度文库 编辑:中财网 时间:2024/05/06 16:26:41
14.2  实例用到的开发技术
在设计理财助手软件时,需要了解掌握地基本技术有:ADO.NET、C#中数据访问类的用法、数据访问的一般过程等。
14.2.1  什么叫ADO.NET
ADO.NET是.NET FrameWork SDK提供给.NET开发语言进行数据库开发的一个系列类库的集合。它可以有效地从数据操作中将数据访问分解为多个可以单独使用或前后使用的不连续组件。
1.ADO.NET的组成
微软设计ADO.NET组件的目的是为了从数据操作中分解出数据访问。完成此任务的是ADO.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数据集是ADO.NET的断开式结构的核心组件,它在与数据源断开的缓存中存储数据,从而实现了独立于任何数据源的数据访问。因此,它可以用于多种不同的数据源,包括XML数据源、远程的或本地的数据库。DataSet包含一个或多个DataTable对象的集合,每个DataTable对象包含DataRow对象、DataColumn对象和Constraint对象,分别存放数据表的行信息、列信息及约束信息。此外DataSet对象还包含DataRelation对象,用于表示表间关系。它们的关系如图14-1所示。
 
图14-1  .NET数据提供程序和DataSet数据集结构图
2.ADO.NET连接数据库的过程
当应用程序需要连接数据库时,首先需要用Connection对象连接数据库,然后用Command对象对数据库进行操作,Command对象的执行结果可以被DataReader对象读取,也可以被DataAdapter对象用来填充DataSet对象。当DataReader读取时,只读一条数据,而DataAdapter对象则把所有数据填充给DataSet。因此DataAdapter对象是DataSet对象与数据库的桥梁。这个过程可以用图14-2表示。
 
图14-2  ADO.NET的结构图
3.ADO.NET的命名空间
命名空间(NameSpace)记录了对象的名称与所在的路径。使用ADO.NET中的对象时,必须首先声明命名空间,这样编译器才知道到哪里去加载这些对象。根据ADO.NET数据提供程序和主要数据对象,ADO.NET的命名空间可分为基本对象类、数据提供程序对象类和辅助对象类等。
* System.Data:此对象类别地址包含大部分的ADO.NET的基础对象,如DataSet、DataTable、DataRow等,故在编写ADO.NET程序时,必须先声明。
* System.Data.OLEDB:当使用Microsoft OLE DB.NET数据提供程序连接SQL Server 6.5以下版本数据库或其他数据库时,必须首先声明此类对象。
* System.Data.SQLClient:当使用Microsoft SQL Server.NET数据提供程序连接SQL Server 7.0以上版本数据库时,必须首先声明此类对象。
* System.Data.Odbc:当使用Microsoft ODBC.NET数据提供程序连接ODBC数据源连接的数据库时,必须首先声明此类对象。
* System.Data.OracleClient:当使用Oracle.NET数据提供程序连接Oracle数据库时,必须首先声明此类对象。
* System.Data.Common:包含由.NET Framework数据提供程序共享的类。数据提供程序描述一个类的集合,这些类用于在托管空间中访问数据源,例如数据库。
* System.Data.Sql:支持特定于SQL Server的功能的类。
* System.Data.SqlTypes:提供一些类,它们在SQL Server 内部用于本机数据类型。这些类提供了其他数据类型的更安全、更快速的替代方式。
* Microsoft.SqlServer.Server:专用于Microsoft .NET Framework公共语言运行库(CLR)与Microsoft SQL Server和SQL Server数据库引擎进程执行环境的集成的类、接口和枚举。
* System.Transactions:允许用户编写自己的事务性应用程序和资源管理器的类。具体来说,可以创建事务并和一个或多个参与者参与事务(本地或分布式)。
图14-3显示了ADO.NET命名空间的结构。
14.2.2  ADO.NET中的类
ADO.NET中的类很多,从一次数据库访问过程看,一般需要4个或5个类,它们的顺序如图14-4所示。
 
图14-4  数据库访问中类的顺序
在使用这些类时,除了基础类DataSet外,其他类的数据提供程序要一致,如SQLConnection、SQLCommand、SQLDataReader是一致的,OLEDbConnection、OLEDbCommand、OLEDbDataAdapter是一致的。
下面我们就以OLEDB数据提供程序为例来说明这些类。
1.基础类DataSet
这个类是数据在内存中驻留时的表示形式。无论什么数据源,它在内存中的数据表示是一致的,因此它可以连接任何数据源。DataSet数据集可以包含任意数量的数据表,以及所有表的约束、索引和关系。它没有与数据源联系的能力,因此在使用DataSet对象之前,必须要有一个可以建立初始化数据的对象,即DataAdapter对象。
该类的主要属性和方法如表14-1。
表14-1  DataSet类的主要属性和方法
类    别
名    称
说    明
属性
DataSetName
获取或设置当前DataSet的名称
Namespace
获取或设置DataSet的命名空间
Tables
获取包含在DataSet中的表的集合
Prefix
获取或设置一个XML前缀,该前缀是DataSet的命名空间的别名
方法
Clear
通过移除所有表中的所有行来清除数据
Clone
复制DataSet的结构,不复制任何数据
Copy
复制该DataSet的结构和数据
ReadXml
将XML架构和数据读入DataSet
ReadXmlSchema
将XML架构读入DataSet
WriteXml
从DataSet写XML数据,还可以选择写架构
WriteXmlSchema
写XML架构形式的DataSet结构
2.OleDbDataAdapter
这个类可以建立并初始化数据集(即DataSet),与DataSet对象结合起来对数据源执行SQL命令,提供DataSet对象所需要的存取数据,可视为DataSet对象的操作核心,是DataSet对象与数据操作对象之间的沟通媒介。
该类的主要属性和方法如表14-2所示。
表14-2  OleDbDataAdapter类的主要属性和方法
类    别
名    称
说    明
属性
DeleteCommand
获取或设置SQL语句或存储过程,用于从数据集中删除记录
SelectCommand
获取或设置SQL语句或存储过程,用于选择数据源中的记录
UpdateCommand
获取或设置SQL语句或存储过程,用于更新数据源中的记录
InsertCommand
获取或设置SQL语句或存储过程,用于将新记录插入到数据源中
方法
Fill
在DataSet中添加或刷新行,以便与ADO Recordset或Record对象中的行相匹配
Update
为DataSet中每个已插入、已更新或已删除的行调用相应的INSERT、UPDATE或DELETE语句
GetFillParameters
获取当执行SQL SELECT语句时由用户设置的参数
3.OleDbDataReader
提供一个单向向前移动且只读的记录集合,可以读取由Command对象执行命令所产生的数据,只能与Command对象一起使用。
该类的主要属性和方法如表14-3所示。
表14-3  OleDbDataReader类的主要属性和方法
类    别
名    称
说    明
属性
Depth
获取一个值,用于指示当前行的嵌套深度
FieldCount
获取当前行中的列数
HasRows
获取一个值,用于指示OleDbDataReader是否包含一行或多行
IsClosed
指示是否可关闭数据读取器
Item
获取以本机格式表示的列的值
RecordsAffected
通过执行SQL语句获取更改、插入或删除的行数
方法
GetBoolean
获取指定列的布尔值形式的值
GetChar
获取指定列的字符形式的值
GetDateTime
获取指定列的DateTime对象形式的值
GetDecimal
获取指定列的Decimal对象形式的值
GetDouble
获取指定列的双精度浮点数形式的值
GetFloat
获取指定列的单精度浮点数形式的值
GetGuid
获取指定列的值作为全局唯一标识符(GUID)
GetInt16
获取指定列的16位有符号整数形式的值
GetInt32
获取指定列的32位有符号整数形式的值
GetString
获取指定列的字符串形式的值
IsDBNull
获取一个值,该值指示列中是否包含不存在的或已丢失的值
Read
使OleDbDataReader前进到下一条记录
4.OleDbCommand
这个类可以操作数据源文件,对数据源下达操作数据库的命令,即传送SQL命令,执行Action Query命令。
该类的主要属性和方法如表14-4所示。
表14-4  OleDbCommand类的主要属性和方法
类    别
名    称
说    明
属性
CommandText
获取或设置要对数据源执行的SQL语句或存储过程
CommandTimeout
获取或设置在终止对执行命令的尝试并生成错误之前的等待时间
Connection
获取或设置OleDbCommand的此实例使用的OleDbConnection
方法
ExecuteNonQuery
针对Connection执行SQL 语句并返回受影响的行数
ExecuteReader
将CommandText发送到Connection并生成一个 OleDbDataReader
ExecuteScalar
执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行
ResetCommandTimeout
将CommandTimeout属性重置为默认值
5.OleDbConnection
该类主要负责与数据源的连接,建立程序与数据源之间的联系,这是数据库操作的第一步。
该类的主要属性和方法如表14-5所示。
表14-5  OleDbCommand类的主要属性和方法
类    别
名    称
说    明
属性
ConnectionString
获取或设置用于打开数据库的字符串
ConnectionTimeout
获取在尝试建立连接时终止尝试并生成错误之前所等待的时间
Database
获取当前数据库或连接打开后要使用的数据库的名称
DataSource
获取数据源的服务器名或文件名
Provider
获取在连接字符串的“Provider = ”子句中指定的OLE DB提供程序的名称
State
获取连接的当前状态
方法
Close
关闭到数据源的连接
Open
使用ConnectionString所指定的属性设置打开数据库连接
以上是以OLEDB数据提供程序为例来说明ADO.NET中的类,其他数据提供程序中的类属性与方法与此类似,这里就不再一一列举。在每一
种数据提供程序的类中,除了DataSet类是公用类外,其他类均需要相应的命名空间支持,而且不可互相串用

14.2.3  如何使用ADO.NET
ADO.NET处理数据库数据一般需要4个步骤。
1.使用Connection连接数据库
ADO.NET处理数据库数据的第一步是连接到数据库,只有先连接上数据库才能进行后续操作。该步骤用到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()方法进行操作。
 
图14-3  ADO.NET命名空间的结构