概述
在前面两节中,我们分别学习了《什么是ADO.NET?》、《ADO.NET的数据库连接字符串》。对ADO.NET的定义,历史由来以及数据库与.NET应用程序建立连接的连接字符串有了一定的认识。
本节将学习ADO.NET中内置的主要的五大对象,即:Connection, Command, DataAdapter, DataReader, DataSet。
自从微软宣布开源.NET源码以后,ADO.NET程序集也一并成了开源项目,具体的源码地址如下:
- .NET Framework版本的ADO.NET程序集源码浏览地址:https://referencesource.microsoft.com/#System.Data/fx/src/data/System/Data/Common
- .NET Framework版本的ADO.NET程序集源码Github托管地址:https://github.com/microsoft/referencesource/tree/master/System.Data/System/Data
- .NETStandard 1.2版本的ADO.NET程序集源码浏览地址:https://source.dot.net/#System.Data.Common
- .NETStandard 1.2版本的ADO.NET程序集源码Github托管地址:https://github.com/dotnet/runtime/tree/ae46d07eb778fd9e1d4cdfe799a9e1ee7ed1d570/src/libraries/System.Data.Common
ADO.NET架构图
以上列出的ADO.NET的五大对象均是抽象概念,这五大对象在不同类型的数据库有不同的实现。在深入学习ADO.NET五大对象之前,先看一张ADO.NET的架构图以了解这五大对象之间的关系:
Connection(连接对象)
使用ADO.NET操作数据库之前,需要建立程序与数据库的连接, Connection
对象就是与数据库建立连的,所有Connection
对象的基类均为DbConnection
抽象类。此外,Connection
连接对象也负责管理事务和连接池。使用ADO.NET建立与SQL Server数据库的连接示例代码如下:
// 数据库连接字符串
var connectionString = "Server=(localdb)\\mssqllocaldb;Integrated Security=true;Database=Demo";
// 实例化一个SQL Server的连接对象
SqlConnection connection = new SqlConnection(connectionString);
// 打开与SQL Server数据库的连接
connection.Open();
// 关闭与SQL Server数据库的连接
connection.Close();
特别注意:在使用完打开的数据库连接之后,请将连接关闭以释放连接资源,否则可能导致数据库连接过多引发异常。
除了以上使用connection.Close();
方法手动关闭连接外,还可以使用using
语句来自动释放连接资源,如:
// 数据库连接字符串
var connectionString = "Server=(localdb)\\mssqllocaldb;Integrated Security=true;Database=Demo";
// 实例化一个SQL Server的连接对象
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 打开与SQL Server数据库的连接
connection.Open();
// 其他业务逻辑代码
}
或者,在C# 8及以上版本,还可使用C#中的using新特性,示例如下:
// 数据库连接字符串
var connectionString = "Server=(localdb)\\mssqllocaldb;Integrated Security=true;Database=Demo";
// 实例化一个SQL Server的连接对象
using SqlConnection connection = new SqlConnection(connectionString);
// 打开与SQL Server数据库的连接
connection.Open();
// 其他业务逻辑代码
// 在connection作用域结束时,将自动释放connection
Command(命令对象)
客户端(应用程序)和数据源之间的每个交互,无论是检索信息、删除记录还是提交更改,都是由Command
对象管理的,所有Command
对象均继承自DbCommand
基类。Command
对象提供了用于存储和执行SQL语句和存储过程的方法,以下是Command
对象可执行的各种命令:
- ExecuteReader:将数据以行的形式返回给客户端(.NET应用程序)。通常是SQL查询语句或包含一个或多个查询语句的存储过程。此方法返回一个
DataReader
对象,该对象可用于填充DataTable
对象或直接逐行输出数据等等。 - ExecuteNonQuery:执行更改数据库中的数据的命令,例如更新(UPDATE)、删除(DELETE)或插入(INSERT)语句,或包含一个或多个这些语句的存储过程。此方法返回一个整数,即受查询影响的行数。
- ExecuteScalar:此方法只返回单个值,比如SQL Server的内置聚合函数(COUNT,SUM,MIN,MAX,AVG等),字符串函数(LEN,LEFT,RIGHT,CHAR,STUFF等),日期函数(DATEADD,DATEDIFF,DATEPART,DAY,GETDATE,MONTH,YEAR等)的查询结果。
DataReader(数据读取器对象)
DataReader
用于检索数据,不能直接实例化一个DataReader
的对象,相反地,只能通过调用Command
对象的ExecuteReader()
方法来获取到DataReader
的实例对象。因此,它必须与Command
对象一起使用,以执行SQL的SELECT
查询语句,然后得到包含返回的行的DataReader
对象。
不需要手动打开
DataReader
对象,相反,当执行Command
命令时,它将被自动初始化。
所有DataReader
对象的基类均为DbDataReader
抽象类,DataReader
对象是以只读的、顺向的方式查看其中所存储的数据,DataReader
在性能上是非常高效的,同时DataReader
对象还是一种非常节省资源的数据对象。
DataAdapter(数据适配器对象)
DataAdapter
用于充当数据集(DataSet
)与数据源之间用于检索和保存数据的桥梁。DataAdapter
使用Fill()
方法将数据源检索到的数据填充到DataSet
或DataTable
中,同时可以使用FillSchema()
方法检索数据表的架构信息。DataAdapter
使用Update()
方法对DataSet
或DataTable
所做的任何更改更新回数据源。
DataSet(数据集对象)
DataSet
(数据集)是ADO.NET的核心。DataSet
本质上是DataTable
对象的集合。每个对象依次包含一个DataColumn和DataRow对象的集合。数据集还包含一个关系集合,可用于定义数据表对象之间的关系。
DataSet
是驻留于内存中的数据集,可以看做是内存中的数据库,内部用XML来描述数据。
以上五大对象的具体用法和示例,请参考本系列相关文章。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册