在 C# 开发中,数据库访问是构建应用程序中至关重要的部分。C# 提供了多种方式来访问数据库,包括低级的 ADO.NET 和高级的 ORM(对象关系映射)框架,如 Entity Framework Core。这篇文章将介绍如何使用 C# 进行数据库访问,从 ADO.NET 基础到使用 LINQ 查询数据库,再到事务管理。
1. ADO.NET 基础
ADO.NET 是 .NET 框架中用于访问关系数据库的核心组件,它允许通过 SQL 命令与数据库交互。ADO.NET 包括数据库连接、命令执行和数据读取等操作,适合需要更细粒度控制的场景。
ADO.NET 核心组件
- Connection:与数据库建立连接。
- Command:执行 SQL 语句或存储过程。
- DataReader:读取从数据库返回的结果集。
- DataAdapter:用于填充 DataSet 的类,适合脱机操作。
连接到数据库并执行 SQL 语句
using (SqlConnection connection = new SqlConnection("your_connection_string"))
{
connection.Open();
string sql = "SELECT * FROM Products";
SqlCommand command = new SqlCommand(sql, connection);
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(reader["ProductName"].ToString());
}
}
}
在这个示例中,我们使用 SqlConnection
连接到数据库,使用 SqlCommand
执行查询,并通过 SqlDataReader
读取数据。这种方法提供了底层的数据库控制,可以用来执行复杂的 SQL 操作。
2. 数据库连接与命令执行
数据库连接 是所有数据库操作的基础,建立连接后,我们可以使用 SQL 命令来进行数据操作。ADO.NET 中的 Command
对象允许执行查询、插入、更新和删除等 SQL 语句。
执行 SQL 插入操作
using (SqlConnection connection = new SqlConnection("your_connection_string"))
{
connection.Open();
string sql = "INSERT INTO Products (ProductName, Price) VALUES (@name, @price)";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@name", "New Product");
command.Parameters.AddWithValue("@price", 99.99);
int rowsAffected = command.ExecuteNonQuery();
Console.WriteLine($"{rowsAffected} row(s) inserted.");
}
在此示例中,SqlCommand.ExecuteNonQuery()
用于执行非查询 SQL 语句,如插入、更新或删除操作。我们使用参数化查询(@name
, @price
)来避免 SQL 注入。
3. Entity Framework Core
Entity Framework Core 是 .NET 中的 ORM 框架,简化了数据库的访问和操作。通过 Entity Framework Core,开发者可以使用 C# 类和 LINQ 查询与数据库交互,而无需编写 SQL 语句。EF Core 适用于大多数常见的数据库操作,并支持 Code First 和 Database First 开发模式。
配置 EF Core
首先,需要在项目中配置 EF Core 和数据库上下文(DbContext
)。以 Code First 为例,定义模型类和上下文类:
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public decimal Price { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("your_connection_string");
}
}
使用 EF Core 执行基本操作
使用 DbContext
进行数据库操作非常简单。以下是添加和查询数据的示例:
using (var context = new AppDbContext())
{
// 添加新产品
var newProduct = new Product { ProductName = "New Product", Price = 99.99M };
context.Products.Add(newProduct);
context.SaveChanges();
// 查询产品
var products = context.Products.ToList();
foreach (var product in products)
{
Console.WriteLine($"{product.ProductName}: {product.Price}");
}
}
EF Core 使得操作数据库更加简单,通过 .Add()
、.ToList()
等方法,可以轻松实现数据的增删查改。
4. 使用 LINQ 查询数据库
LINQ(Language Integrated Query) 是 C# 中用于查询集合的强大工具,EF Core 完全支持使用 LINQ 进行数据库查询。LINQ 查询使代码更加简洁易读,并且支持类型检查,避免了 SQL 语句中的拼写错误。
基本 LINQ 查询
using (var context = new AppDbContext())
{
var cheapProducts = context.Products
.Where(p => p.Price < 50)
.OrderBy(p => p.ProductName)
.ToList();
foreach (var product in cheapProducts)
{
Console.WriteLine($"{product.ProductName}: {product.Price}");
}
}
在这个示例中,我们使用 LINQ 查询价格低于 50 的产品,并按名称排序。LINQ 查询和 SQL 类似,但它与 C# 紧密结合,可以利用类型安全和 IntelliSense。
5. 事务管理
在数据库操作中,事务管理 确保多步操作作为一个单元执行。如果事务中的任何一步失败,所有更改将被回滚,保证数据一致性。ADO.NET 和 EF Core 都支持事务。
使用 ADO.NET 事务
using (SqlConnection connection = new SqlConnection("your_connection_string"))
{
connection.Open();
SqlTransaction transaction = connection.BeginTransaction();
try
{
SqlCommand command = new SqlCommand("UPDATE Products SET Price = Price * 1.1", connection, transaction);
command.ExecuteNonQuery();
command.CommandText = "INSERT INTO Logs (Message) VALUES ('Prices updated')";
command.ExecuteNonQuery();
transaction.Commit(); // 提交事务
}
catch
{
transaction.Rollback(); // 事务回滚
}
}
在这个示例中,如果在更新价格或插入日志时发生异常,事务将被回滚。
使用 EF Core 事务
EF Core 也支持事务,可以通过 Database.BeginTransaction()
方法开始事务。
using (var context = new AppDbContext())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
// 执行数据库操作
var product = context.Products.First();
product.Price *= 1.1M;
context.SaveChanges();
transaction.Commit(); // 提交事务
}
catch
{
transaction.Rollback(); // 事务回滚
}
}
}
EF Core 的事务管理与 ADO.NET 类似,允许你确保多步骤操作的一致性。
结论
C# 提供了多种数据库访问方式,从 ADO.NET 到高级的 Entity Framework Core,每种方式都有其适用的场景。ADO.NET 适合需要更精细控制的低级别操作,而 Entity Framework Core 则为常规数据库访问提供了更加简洁的代码和更高的生产力。
- ADO.NET 提供底层控制,适合复杂 SQL 操作。
- Entity Framework Core 简化了数据访问,使用 LINQ 查询和对象映射。
- 事务管理 在多步骤操作中至关重要,确保数据一致性。
通过掌握这些技术,你可以构建高效且可靠的数据库驱动应用程序。如果你有进一步的问题或需要更深入的示例,欢迎继续探讨!
这篇博客介绍了 C# 数据库访问的基础和高级用法。如果你有任何问题,欢迎联系我或在评论区提出你的问题!