下表显示组成 ADO.NET 数据提供程序的四个核心对象:
表 1. 一个 ADO.NET 数据提供程序的核心对象 | |
对象 | 描述 |
Connection | 建立到指定资源的连接 |
Command | 对一个数据源执行命令。公开 Parameters,在 Connection 的 Transaction 范围内执行。 |
DataReader | 从一个数据源读取只进的只读数据流。 |
DataAdapter | 填充一个 DataSet,解析数据源的更新 |
Command 对象提供了一些不同的 Execute 方法来启动存储过程,执行查询或者执行非查询语句,例如更新或插入:
1. | ExecuteReader 方法 — 将数据作为一个 DataReader 对象返回。用于任何返回数据的 SQL 查询。 |
2. | ExecuteScalar 方法 — 返回单独值,例如与特定查询相匹配的记录数,或者数据库功能调用的结果。 |
3. | ExecuteNonQuery 方法 — 执行不返回任何行的命令。典型的例子是存储过程、插入和更新。 |
当然,您需要依据初始化 Command 对象时创建的命令来选择正确的 Execute 方法。
ExecuteReader 方法将任何结果都返回到 DataReader 对象。DataReader 对象是查询数据库返回的一个关联的、只进的只读数据流。执行查询时,第一行返回到 DataReader 中。数据流保持到数据库的连接,然后返回下一条记录。DataReader 从数据库中读取行数据时,每行的列值都被读取和计算,但是不能被编辑。
DataAdapter 和 DataSet
虽然连接数据库的应用程序使用 DataReader 就已足够,但是,DataReader 不能很好地支持数据库访问的断开连接模型。而 DataAdapter 和 DataSet 类则满足了这一需求。
DataSet 是 ADO.NET 断开连接体系结构中主要的数据存储工具。填充 DataSet 时,并非通过 Connection 对象将 DataSet 直接连接到数据库。您必须创建一个 DataAdapter 来填充 DataSet。DataAdapter 连接数据库,执行查询并填充 DataSet。当 DataAdapter 调用 Fill 或 Update 方法时,在后台完成所有的数据传输。每个 .NET Framework 的数据提供程序都有一个 DataAdapter 对象。
一个 DataSet 代表一组完整的数据,包括表格、约束条件和表关系。DataSet 能够存储代码创建的本地数据,也能存储来自多个数据源的数据,并断开到数据库的连接。
DataAdapter 能控制与现有数据源的交互。DataAdapter 也能将对 DataSet 的变更传输回数据源中。下列代码说明使用 DataSet 典型情况。
//返回DataReader
public static SqlDataReader GetProducts()
{
SqlConnection con = new SqlConnection(conString);
string selectString = "SELECT * FROM Products";
SqlCommand cmd = new SqlCommand(selectString, con);
con.Open();
SqlDataReader dtr =
cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dtr;
}