位置: 文档库 > C#(.NET) > C#操作MySQL的工具类MySqlHelper

C#操作MySQL的工具类MySqlHelper

赵又廷 上传于 2025-02-23 03:29

《C#操作MySQL的工具类MySqlHelper》

在.NET开发中,数据库操作是核心功能之一。MySQL作为开源关系型数据库的代表,与C#的结合广泛应用于企业级应用开发。本文将详细介绍如何设计一个高效、可复用的MySqlHelper工具类,涵盖连接管理、参数化查询、事务处理等关键功能,并提供完整的代码实现与使用示例。

一、工具类设计目标

MySqlHelper工具类的核心目标是简化C#对MySQL的操作流程,解决以下痛点:

  • 重复编写连接字符串与连接对象管理代码

  • 手动处理参数化查询的繁琐过程

  • 事务操作的复杂性导致代码冗余

  • 缺乏统一的异常处理机制

通过封装常用操作,开发者可以专注于业务逻辑实现,提升代码可维护性。

二、核心功能实现

1. 连接管理

使用单例模式管理MySQL连接,避免频繁创建销毁连接对象。配置信息通过App.config或硬编码方式存储。

public class MySqlHelper
{
    private static readonly string ConnectionString = "server=localhost;user=root;database=test;port=3306;password=123456;";
    
    private static MySqlConnection GetConnection()
    {
        return new MySqlConnection(ConnectionString);
    }
}

2. 基础CRUD操作

实现ExecuteNonQuery(增删改)、ExecuteScalar(单值查询)、ExecuteReader(多行查询)三个核心方法。

// 执行非查询操作(返回影响行数)
public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
{
    using (var conn = GetConnection())
    {
        conn.Open();
        using (var cmd = new MySqlCommand(sql, conn))
        {
            if (parameters != null)
                cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteNonQuery();
        }
    }
}

// 执行查询返回首行首列
public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
{
    using (var conn = GetConnection())
    {
        conn.Open();
        using (var cmd = new MySqlCommand(sql, conn))
        {
            if (parameters != null)
                cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteScalar();
        }
    }
}

// 执行查询返回DataReader
public static MySqlDataReader ExecuteReader(string sql, params MySqlParameter[] parameters)
{
    var conn = GetConnection();
    conn.Open();
    var cmd = new MySqlCommand(sql, conn);
    if (parameters != null)
        cmd.Parameters.AddRange(parameters);
    return cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

3. 参数化查询封装

通过MySqlParameter数组实现安全查询,防止SQL注入。

// 示例:查询用户信息
var sql = "SELECT * FROM Users WHERE Username = @username AND Password = @password";
var parameters = new[]
{
    new MySqlParameter("@username", "admin"),
    new MySqlParameter("@password", "123456")
};

using (var reader = MySqlHelper.ExecuteReader(sql, parameters))
{
    while (reader.Read())
    {
        Console.WriteLine($"ID: {reader["Id"]}, Name: {reader["Username"]}");
    }
}

4. 事务处理支持

封装事务操作,确保多表更新的原子性。

public static void ExecuteTransaction(Action action)
{
    using (var conn = GetConnection())
    {
        conn.Open();
        using (var trans = conn.BeginTransaction())
        {
            try
            {
                action(trans);
                trans.Commit();
            }
            catch
            {
                trans.Rollback();
                throw;
            }
        }
    }
}

// 使用示例
MySqlHelper.ExecuteTransaction(trans =>
{
    var sql1 = "UPDATE Account SET Balance = Balance - 100 WHERE Id = 1";
    var sql2 = "UPDATE Account SET Balance = Balance + 100 WHERE Id = 2";
    
    using (var cmd1 = new MySqlCommand(sql1, trans.Connection, trans))
    using (var cmd2 = new MySqlCommand(sql2, trans.Connection, trans))
    {
        cmd1.ExecuteNonQuery();
        cmd2.ExecuteNonQuery();
    }
});

5. 异步操作支持(.NET Core+)

针对高并发场景,提供异步方法实现。

public static async Task ExecuteNonQueryAsync(string sql, params MySqlParameter[] parameters)
{
    using (var conn = GetConnection())
    {
        await conn.OpenAsync();
        using (var cmd = new MySqlCommand(sql, conn))
        {
            if (parameters != null)
                cmd.Parameters.AddRange(parameters);
            return await cmd.ExecuteNonQueryAsync();
        }
    }
}

// 调用示例
await MySqlHelper.ExecuteNonQueryAsync(
    "INSERT INTO Logs (Message) VALUES (@msg)",
    new MySqlParameter("@msg", "System started")
);

三、高级功能扩展

1. 批量操作优化

使用MySqlBulkLoader实现大数据量导入。

public static void BulkInsert(string tableName, string filePath, char[] fieldTerminator = null)
{
    var loader = new MySqlBulkLoader(GetConnection())
    {
        TableName = tableName,
        FileName = filePath,
        FieldTerminator = fieldTerminator ?? ",",
        NumberOfLinesToSkip = 1
    };
    loader.Load();
}

2. 存储过程调用

public static object ExecuteProcedure(string procedureName, params MySqlParameter[] parameters)
{
    using (var conn = GetConnection())
    {
        conn.Open();
        using (var cmd = new MySqlCommand(procedureName, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            if (parameters != null)
                cmd.Parameters.AddRange(parameters);
            return cmd.ExecuteScalar();
        }
    }
}

3. 连接池配置

在连接字符串中优化连接池参数:

// 推荐配置
"server=...;pooling=true;MinimumPoolSize=5;MaximumPoolSize=100;ConnectionLifetime=300;"

四、最佳实践与注意事项

1. 连接管理:始终使用using语句确保连接释放

2. 异常处理:捕获MySqlException并记录详细错误信息

3. 性能优化:

  • 避免在循环中频繁创建连接

  • 批量操作时使用事务

  • 合理设置连接池参数

4. 安全建议:

  • 敏感信息(如密码)使用加密存储

  • 最小权限原则配置数据库用户

五、完整工具类代码

using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Threading.Tasks;

public static class MySqlHelper
{
    private static readonly string ConnectionString = "server=localhost;user=root;database=test;port=3306;password=123456;";

    // 同步方法
    public static int ExecuteNonQuery(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = GetConnection())
        {
            conn.Open();
            using (var cmd = new MySqlCommand(sql, conn))
            {
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return cmd.ExecuteNonQuery();
            }
        }
    }

    public static object ExecuteScalar(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = GetConnection())
        {
            conn.Open();
            using (var cmd = new MySqlCommand(sql, conn))
            {
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return cmd.ExecuteScalar();
            }
        }
    }

    public static MySqlDataReader ExecuteReader(string sql, params MySqlParameter[] parameters)
    {
        var conn = GetConnection();
        conn.Open();
        var cmd = new MySqlCommand(sql, conn);
        if (parameters != null)
            cmd.Parameters.AddRange(parameters);
        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
    }

    // 异步方法
    public static async Task ExecuteNonQueryAsync(string sql, params MySqlParameter[] parameters)
    {
        using (var conn = GetConnection())
        {
            await conn.OpenAsync();
            using (var cmd = new MySqlCommand(sql, conn))
            {
                if (parameters != null)
                    cmd.Parameters.AddRange(parameters);
                return await cmd.ExecuteNonQueryAsync();
            }
        }
    }

    // 事务处理
    public static void ExecuteTransaction(Action action)
    {
        using (var conn = GetConnection())
        {
            conn.Open();
            using (var trans = conn.BeginTransaction())
            {
                try
                {
                    action(trans);
                    trans.Commit();
                }
                catch
                {
                    trans.Rollback();
                    throw;
                }
            }
        }
    }

    private static MySqlConnection GetConnection()
    {
        return new MySqlConnection(ConnectionString);
    }
}

关键词:C#、MySQL、工具类、参数化查询、事务处理、异步操作、连接池、存储过程、批量导入

简介:本文详细介绍了C#中操作MySQL数据库的MySqlHelper工具类设计与实现,涵盖连接管理、CRUD操作、事务处理、异步支持等核心功能,提供完整代码示例与最佳实践建议,帮助开发者快速构建高效、安全的数据库访问层。

《C#操作MySQL的工具类MySqlHelper.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档