.NET 复习笔记 / ADO.NET
一、概述
http:// ADO.NET 是 .NET 平台上“标准”的数据库访问组件,由 ADO 发展而来。ADO 全称 ActiveX Data Objects(ActiveX数据对象),于1996 年由微软发布,它的作用是在 ODBC 和OLE DB 接口之上建立统一的数据库访问编程模型。所以作为 .NET 平台上的 ADO, http:// ADO.NET 就是 .NET 平台上“标准”的数据库访问编程模型,它支持诸如 SQL Server 和 XML 等数据源以及支持 OLE DB 和 ODBC 接口的数据源并提供一致的访问。
下面这张图描述了它们之间的关系。
想要了解更多关于 ADO, http:// ADO.NET ,OLE DB 和 ODBC 以及它们之间的关系与发展历程,可以查阅这篇文章。
二、组成与概念
http:// ADO.NET 位于 Sytem.Data 命名空间及其子命名空间,包含了两个组成部分:
- 用于接入数据库的 .NET Data Providers 。
- 用于操作数据的 Dataset 。
.NET Data Provider / 数据提供程序
.NET Data Provider 组件用于连接数据源并提供用于操作数据库的对象。其中 Connection 对象提供了与数据源的连接。 Command 对象表示数据库命令,使用它可以获取,修改数据以及执行存储过程,并且可以设置命令的参数信息。 DataReader 对象是一个高性能的数据源“流”(Stream)。 DataAdapter 对象提供了 DataSet 对象与数据源之间的桥梁,DataAdapter 使用 Command 对象来执行 SQL 命令,可以把数据载入 DataSet 并将 DataSet 中的数据变化同步到数据源中。
下面是使用上述对象的示例代码:
连接数据库
// Assumes connectionString is a valid connection string.
using (SqlConnection connection = new SqlConnection(connectionString))
connection.Open();
// Do work here.
创建并执行 SqlCommand
// Assumes connection is a valid SqlConnection.
connection.Open();
string queryString = "INSERT INTO Customers " +
"(CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')";
SqlCommand command = new SqlCommand(queryString, connection);
Int32 recordsAffected = command.ExecuteNonQuery();
创建 SqlCommand 设置参数,执行获取 DataReader 并遍历
static void GetSalesByCategory(string connectionString, string categoryName)
using (SqlConnection connection = new SqlConnection(connectionString))
// 创建 command 并设置属性
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "SalesByCategory";
command.CommandType = CommandType.StoredProcedure;
// 添加输入参数并设置属性
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@CategoryName";
parameter.SqlDbType = SqlDbType.NVarChar;
parameter.Direction = ParameterDirection.Input;
parameter.Value = categoryName;
// 添加参数到 command 的参数集合中
command.Parameters.Add(parameter);
// 打开链接并执行 DataReader
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
if (reader.HasRows)
while (reader.Read())
Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);
Console.WriteLine("No rows found.");
reader.Close();
使用 DataAdapter 获取 DataSet
// Assumes that connection is a valid SqlConnection object.
string queryString = "SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");
http:// ADO.NET 内置了 ODBC、OLEDB 以及 SQL Server 的 Data Provider,它们对应的命名空间分别为 System.Data.Odbc、System.Data.OleDb、System.Data.SqlClient。
下面列出其他常见数据库 Data Provider 的下载页面。
DataSet / 数据集
DataSet 是独立于数据源的数据访问对象,这样的设计可以使它与多个不同的数据源一起使用,DataSet 对象包含了 DataTable 对象集合,而 DataTable 中包含了行(DataRow)、列(DataColumn)、主键、外键、约束以及 DataTable 数据关系的信息。
下图显示了 DataSet 与其中主要对象的关系。
LINQ to DataSet
LINQ to DataSet 相当于 LINQ to Objects 的衍生,如果不了解 LINQ to Objects 可以查阅下面的文章。
LINQ to DataSet 并不会像 LINQ to SQL 把查询转换为SQL语句到数据库中执行,LINQ to DataSet 仅仅是让 DataTable 和 DataRow 对象支持 LINQ 查询,功能分别由 DataTableExtensions 和 DataRowExtensions 这两个类提供,在 .NET Core 上这两个类会在 .NET Core 3.0 中加入。
LINQ to DataSet 与 http:// ADO.NET 的关系如下图所示。
LINQ to DataSet 示例代码。
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag") == true
select new
SalesOrderID = order.Field<int>("SalesOrderID"),
OrderDate = order.Field<DateTime>("OrderDate"),
SalesOrderNumber = order.Field<string>("SalesOrderNumber")
foreach (var onlineOrder in query)