下面列出的网站内容(数据集DataSet、ADO、ODBC、OLEDB的数据访问组件)

优采云 发布时间: 2021-12-18 21:06

  下面列出的网站内容(数据集DataSet、ADO、ODBC、OLEDB的数据访问组件)

  一、概述

  ADO.NET 是.NET 平台上的“标准”数据库访问组件,由ADO 开发。ADO 的全称是 ActiveX Data Objects。它由微软于1996年发布,其功能是建立基于ODBC和OLE DB接口的统一数据库访问编程模型。因此作为.NET 平台上的ADO,ADO.NET 是.NET 平台上的“标准”数据库访问编程模型。它支持 SQL Server 和 XML 等数据源,以及支持 OLE DB 和 ODBC 接口的数据源,并提供一致的访问。

  下图描述了它们之间的关系。

  

  ADO、ADO.NET、ODBC、OLEDB之间的关系

  如果你想进一步了解ADO、ADO.NET、OLE DB和ODBC,以及它们之间的关系和发展,可以阅读这篇文章。

  二、组成和概念

  ADO.NET 位于 Sytem.Data 命名空间及其子命名空间中,由两个组件组成:

  .NET 数据提供者/数据提供者

  .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]);

}

}

else

{

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");

  ADO.NET 内置了 ODBC、OLEDB 和 SQL Server Data Provider,它们对应的命名空间分别是 System.Data.Odbc、System.Data.OleDb、System.Data.SqlClient。

  下面列出了其他常见数据库数据提供程序的下载页面。

  数据集/数据集

  DataSet 是一个独立于数据源的数据访问对象。这种设计允许它与多个不同的数据源一起使用。DataSet 对象收录DataTable 对象的集合,而DataTable 收录行(DataRow)、列(DataColumn)、关于主键、外键、约束和DataTable 数据关系的信息。

  下图显示了 DataSet 与其主要对象之间的关系。

  

  DataSet 和其他类型的关系

  LINQ 到数据集

  LINQ to DataSet 等价于 LINQ to Objects 的衍生物。如果你不了解LINQ to Objects,可以参考下面的文章。

  LINQ to DataSet 不会像 LINQ to SQL 那样将查询转换为要在数据库中执行的 SQL 语句。LINQ to DataSet 只允许 DataTable 和 DataRow 对象支持 LINQ 查询。这些函数分别由.NET中的DataTableExtensions和DataRowExtensions类提供,Core上的这两个类将在.NET Core3.0中添加。

  LINQ to DataSet 与 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("OnlineOrderFlag") == true

select new

{

SalesOrderID = order.Field("SalesOrderID"),

OrderDate = order.Field("OrderDate"),

SalesOrderNumber = order.Field("SalesOrderNumber")

};

foreach (var onlineOrder in query)

{

Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",

onlineOrder.SalesOrderID,

onlineOrder.OrderDate,

onlineOrder.SalesOrderNumber);

}

  更多 LINQ to DataSet 示例代码可以在以下文档中查看。

  三、ORM 和实体框架

  随着数据访问技术的发展,为了解决面向对象语言和关系数据库两种理论之间的差异,ORM(Object-relational mapping)应运而生。直观地说,我不想用SQL来描述面向对象语言中的查询,也不想用DataTable或DataRow来表示数据。

  对于 SQL 查询语句,我们可以使用语言本身来代替,例如方法或更“优雅”的 LINQ。对于DataTable和DataRow,我们可以使用具有更多业务意义的实体类型来表示。说两者的结合是ORM并不严谨。

  在大多数情况下,我们仍然使用关系数据库,因此代码中表达的查询需要转换为 SQL 语句才能在数据库中执行。因此,ORM 框架会有一个“引擎”,将代码表达的查询转换为 SQL 语句。. 对于实体类的构建,主要的技术点是编程语言类型与数据库数据类型的对应关系以及模型的构建。

  ADO.NET Entity Framework 是微软基于 ADO.NET 开发的 ORM 解决方案。它曾经是.NET Framework的一部分,并被添加到.NET Framework 3.5中,但在Version 6之后与.NET Framework分离,并更名为Entity Framework 6 / EF 6。它对应到 .NET Core 上的 Entity Framework Core / EF Core。

  由于本文主要介绍ADO.NET,Entity Framework的内容不再深入介绍。更多内容可以前往下方官方文档主页。

  四、ADO.NET 中的 LINQ

  ADO.NET中LINQ相关技术如下图所示。

  

  我们已经在上面介绍了 LINQ to DataSet。此外,.NET Framework 3.5 之后的ADO.NET 还收录一个轻量级的ORM 组件LINQ to SQL,位于System.Data.Linq Namespaces。但是,.NET Core 中不存在该组件,感兴趣的读者可以阅读以下文档。

  LINQ to Entities 是一个组件,用于使实体框架中的实体对象支持 LINQ 查询。有关更多信息,请参阅以下文档。

  四、结论

  ADO.NET 是 .NET 平台访问数据源(尤其是关系数据库)的“标准”方式。但是,随着数据库技术的发展,现在有很多非关系型数据库,如MongoDB、Redis等。他们有自己的“驱动程序”和编程模型,而不是基于 ADO.NET。

  本文简单梳理了ADO.NET的方方面面,旨在让读者对ADO.NET有更全面的了解。具体用法请参考文章中提供的相关文档。如果这篇文章对你有帮助,我会很高兴。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线