作为一名.NET开发者,你可能经常需要与数据库打交道。今天我们就来聊聊如何在C#中通过MySqlConnector这个轻量级但功能强大的库,对MySQL数据库进行数据更新和删除操作。本文将通过大量实例代码和场景分析,带你全面掌握这项实用技能。


1. 准备工作与环境搭建

在开始编写代码之前,我们需要先准备好开发环境:

  1. 安装MySQL数据库(本地或远程均可)
  2. Visual Studio 2022或更高版本
  3. 通过NuGet安装MySqlConnector包
# NuGet控制台安装命令
Install-Package MySqlConnector -Version 2.3.0

建议使用最新稳定版本(当前为2.3.0),该版本支持.NET 5/6/7和.NET Core 3.1+。相较于官方MySQL Connector/NET,MySqlConnector具有更好的性能表现和更完善的异步支持。


2. 数据库连接与参数化查询基础

所有数据库操作的基础都是建立连接。我们先创建一个可复用的连接方法:

public MySqlConnection GetConnection()
{
    // 连接字符串参数说明:
    // Server=IP地址或域名
    // Database=数据库名称
    // Uid=用户名
    // Pwd=密码
    // Port=端口(默认3306)
    // SslMode=Preferred(推荐启用SSL加密)
    string connectionString = "Server=localhost;Database=mydb;Uid=root;Pwd=123456;Port=3306;SslMode=Preferred";
    return new MySqlConnection(connectionString);
}

注意: 生产环境中建议将连接字符串存储在配置文件中,此处为演示方便直接硬编码。


3. 数据更新操作详解

3.1 基础更新示例

以下示例演示如何更新用户表中的邮箱地址:

public async Task UpdateUserEmail(int userId, string newEmail)
{
    using var connection = GetConnection();
    await connection.OpenAsync();

    const string sql = @"
        UPDATE users 
        SET email = @newEmail
        WHERE user_id = @userId";

    using var command = new MySqlCommand(sql, connection);
    
    // 参数化查询(防止SQL注入)
    command.Parameters.AddWithValue("@userId", userId);
    command.Parameters.AddWithValue("@newEmail", newEmail);

    int affectedRows = await command.ExecuteNonQueryAsync();
    
    Console.WriteLine($"成功更新 {affectedRows} 条记录");
}

3.2 批量更新优化

当需要更新多条记录时,建议使用事务处理:

public async Task BatchUpdatePrices(Dictionary<int, decimal> priceUpdates)
{
    using var connection = GetConnection();
    await connection.OpenAsync();
    using var transaction = await connection.BeginTransactionAsync();

    try
    {
        const string sql = @"
            UPDATE products 
            SET price = @newPrice 
            WHERE product_id = @productId";

        foreach (var (productId, newPrice) in priceUpdates)
        {
            using var command = new MySqlCommand(sql, connection, transaction);
            command.Parameters.AddWithValue("@productId", productId);
            command.Parameters.AddWithValue("@newPrice", newPrice);
            await command.ExecuteNonQueryAsync();
        }

        await transaction.CommitAsync();
        Console.WriteLine("批量更新成功完成");
    }
    catch (Exception ex)
    {
        await transaction.RollbackAsync();
        Console.WriteLine($"更新失败:{ex.Message}");
    }
}

4. 数据删除操作实践

4.1 单条记录删除

删除用户订单的典型实现:

public async Task DeleteOrder(int orderId)
{
    using var connection = GetConnection();
    await connection.OpenAsync();

    const string sql = @"
        DELETE FROM orders 
        WHERE order_id = @orderId";

    using var command = new MySqlCommand(sql, connection);
    command.Parameters.AddWithValue("@orderId", orderId);

    int affectedRows = await command.ExecuteNonQueryAsync();
    
    if (affectedRows == 0)
    {
        Console.WriteLine("未找到对应订单");
    }
    else
    {
        Console.WriteLine($"成功删除 {affectedRows} 条订单记录");
    }
}

4.2 级联删除处理

当需要删除主表记录及其关联数据时:

public async Task DeleteUserWithRelatedData(int userId)
{
    using var connection = GetConnection();
    await connection.OpenAsync();
    using var transaction = await connection.BeginTransactionAsync();

    try
    {
        // 删除关联订单
        var deleteOrdersCmd = new MySqlCommand(
            "DELETE FROM orders WHERE user_id = @userId", 
            connection, 
            transaction);
        deleteOrdersCmd.Parameters.AddWithValue("@userId", userId);
        await deleteOrdersCmd.ExecuteNonQueryAsync();

        // 删除用户主记录
        var deleteUserCmd = new MySqlCommand(
            "DELETE FROM users WHERE user_id = @userId",
            connection,
            transaction);
        deleteUserCmd.Parameters.AddWithValue("@userId", userId);
        await deleteUserCmd.ExecuteNonQueryAsync();

        await transaction.CommitAsync();
        Console.WriteLine("用户及关联数据删除成功");
    }
    catch (Exception ex)
    {
        await transaction.RollbackAsync();
        Console.WriteLine($"删除失败:{ex.Message}");
    }
}

5. 应用场景分析

5.1 典型使用场景

  1. 用户管理系统:修改用户信息、删除账户
  2. 电商系统:更新商品库存、删除下架商品
  3. 日志系统:定期清理过期日志
  4. 配置中心:动态调整系统参数

5.2 技术选型对比

特性 MySqlConnector Dapper Entity Framework
性能 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐
开发效率 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
学习曲线 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐
复杂查询支持 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
事务管理 ⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐

6. 技术实现注意事项

  1. 参数化查询必须:始终使用@parameter形式,避免SQL注入
  2. 连接及时释放:严格使用using语句或手动Dispose()
  3. 异步方法优先:推荐使用ExecuteNonQueryAsync等异步方法
  4. 事务粒度控制:单个事务持续时间不宜超过3秒
  5. 错误日志记录:捕获MySqlException并记录详细信息

7. 关联技术扩展

7.1 连接池优化

MySqlConnector默认启用连接池,可通过连接字符串参数调整:

// 示例连接字符串添加池配置
"Server=localhost;...;Pooling=true;MinimumPoolSize=5;MaximumPoolSize=100"

7.2 超时控制

设置合理的命令超时时间:

var command = new MySqlCommand(sql, connection)
{
    CommandTimeout = 30 // 单位:秒
};

8. 总结与建议

通过本文的讲解,相信你已经掌握了使用MySqlConnector进行数据更新和删除的核心方法。总结几个关键点:

  1. 简单场景:直接使用参数化查询+异步方法
  2. 复杂事务:配合TransactionScope实现分布式事务
  3. 性能优化:合理使用批处理命令(MySqlBatchCommand)
  4. 维护建议:定期检查慢查询日志,优化索引

建议在以下场景选择MySqlConnector:

  • 需要直接控制SQL语句
  • 对性能要求较高的读写操作
  • 需要与存储过程深度集成

而对于复杂对象关系映射,建议配合Dapper或EF Core使用。希望本文能成为你数据库操作路上的实用指南!