掌握 C# 数据库访问:从 ADO.NET 到 Entity Framework

在 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# 数据库访问的基础和高级用法。如果你有任何问题,欢迎联系我或在评论区提出你的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值