ADO.NET是.NET平台上的一组用于访问和操作关系型数据库的API。它提供了一种以统一的方式连接到各种数据库系统并执行数据库操作的方法。现在有很多的ORM
框架都是基于ADO.NET
进行数据访问(比如:Entity Framework (EF)、Dapper、NHibernate
、FluentNHibernate等)。
ADO.NET有几个关键的组件:
-
数据提供程序(Data Provider):数据提供程序是用于连接到特定数据库系统并执行数据库操作的组件。每个数据库系统都有自己的数据提供程序。常见的数据提供程序包括SqlClient(用于连接到Microsoft SQL Server)、OracleClient(用于连接到Oracle数据库)等。
-
数据集(Dataset):数据集是ADO.NET中的一个重要概念,它是一个内存中的数据容器,用于存储从数据库中检索到的数据。数据集可以包含多个数据表,每个表可以包含多个数据行和数据列。通过数据集,我们可以在应用程序中操作和管理数据。
-
数据表适配器(Data Adapter):数据表适配器是用于从数据库中检索数据并将其填充到数据集中的组件。数据表适配器可以执行数据库查询并将结果填充到数据表中。它还可以将对数据表的更改反向传输到数据库。
-
命令对象(Command):命令对象用于执行数据库操作,如查询、插入、更新和删除。命令对象可以与数据提供程序一起使用,执行SQL语句或存储过程。
下面是一个使用ADO.NET进行数据库操作的示例:
- 创建实体类:
csharp
public class Customer
{
public int CustomerID { get; set; }
public string CompanyName { get; set; }
}
- 执行查询并转换为实体集合:
csharp
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
public class Program
{
static void Main()
{
string connectionString = "Data Source=(local);Initial Catalog=SampleDB;Integrated Security=True";
string query = "SELECT * FROM Customers";
List<Customer> customers = new List<Customer>();
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(query, connection);
SqlDataAdapter adapter = new SqlDataAdapter(command);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
foreach (DataRow row in dataTable.Rows)
{
Customer customer = new Customer
{
CustomerID = Convert.ToInt32(row["CustomerID"]),
CompanyName = row["CompanyName"].ToString()
};
customers.Add(customer);
}
}
foreach (var customer in customers)
{
Console.WriteLine($"CustomerID: {customer.CustomerID}, CompanyName: {customer.CompanyName}");
}
}
}
在这个示例中,我们创建了一个实体类 Customer
,用于存储查询的结果。
然后我们使用 SqlConnection
建立数据库连接,并创建一个 SqlCommand
对象来执行查询。
接下来,我们实例化一个 SqlDataAdapter
对象,并使用它的 Fill
方法将查询结果填充到一个 DataTable
中。
然后,我们遍历 DataTable
中的每一行,并根据每一行的数据创建一个 Customer
实例,并将其添加到 List<Customer>
中。
最后,我们使用 foreach
循环遍历实体集合,并打印每个客户的 ID 和公司名称。
使用 DataAdapter
是一种常见的将查询结果转换为实体集合的方式,尤其是当你需要使用 DataTable
进行数据操作时。但请注意,这种方式会将查询结果一次性加载到内存中,如果数据量较大,可能会对性能产生影响。你可以根据实际情况选择合适的数据访问方式。