在 C# 中连接 MySQL 数据库是一项非常常见的任务。下面我将为您提供一个从基础到进阶的完整指南,包括环境配置、代码实现、最佳实践和常见问题处理。

一、 选择连接器(驱动)

在 C# (.NET) 中连接 MySQL,官方推荐使用 MySQL Connector/NET,这是一个完全托管的 ​​ADO.NET​​ 驱动程序。现在它主要通过 NuGet 包进行分发,包名称为:

  • MySql.Data

#安装 NuGet 包

在您的 C# 项目(如 Console App, ​​ASP.NET​​ Core 等)中,通过以下方式安装:

  1. Visual Studio:右键点击项目 -> “管理 NuGet 程序包” -> 搜索 “​​MySql.Data​​” -> 安装。
  2. .NET CLI:在终端中运行以下命令:
dotnet add package MySql.Data

二、 基础连接代码(​​ADO.NET​​ 方式)

这是最直接、最可控的方式,类似于连接 SQL Server 的方式。

#1. 引入必要的命名空间

using MySql.Data.MySqlClient; // 核心命名空间
using System.Data; // 可选,用于 DataTable 等类

#2. 构建连接字符串(Connection String)

连接字符串包含连接到数据库所需的所有信息。以下是关键参数:

参数

描述

示例

​Server​

MySQL 服务器地址

​localhost​​​, ​​127.0.0.1​​​, ​​example.com​

​Port​

端口号(可选,默认 3306)

​3306​

​Database​

要连接的数据库名称

​mydatabase​

​Uid​

用户名

​root​

​Pwd​

密码

​your_password​

​Charset​

字符集(强烈建议设置

​utf8mb4​​ (支持表情符号)

示例连接字符串:

string connectionString = "Server=localhost;Port=3306;Database=mydatabase;Uid=root;Pwd=myPassword;Charset=utf8mb4;";

重要提示: 永远不要将连接字符串硬编码在代码中!应将其存储在配置文件中,如 ​​appsettings.json​​ (​​ASP.NET​​ Core) 或 ​​App.config​​/​​Web.config​​ (传统 .NET Framework)。

#3. 完整的连接与查询示例

以下是一个控制台应用程序的完整示例,演示了如何建立连接、执行查询并读取数据。

using System;
using MySql.Data.MySqlClient;

namespace MySqlConnectionExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 定义连接字符串
            string connectionString = "server=localhost;user=root;password=123456;database=testdb;charset=utf8mb4;";

            // 2. 创建 MySqlConnection 对象
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                try
                {
                    // 3. 打开数据库连接
                    connection.Open();
                    Console.WriteLine("Connection opened successfully.");

                    // 4. 编写 SQL 查询
                    string sql = "SELECT id, name, email FROM users WHERE id > @id"; // 使用参数化查询防止SQL注入

                    // 5. 创建 Command 对象
                    using (MySqlCommand command = new MySqlCommand(sql, connection))
                    {
                        // 6. 添加参数
                        command.Parameters.AddWithValue("@id", 0);

                        // 7. 执行查询,获取 MySqlDataReader
                        using (MySqlDataReader reader = command.ExecuteReader())
                        {
                            // 8. 检查是否有数据返回
                            if (reader.HasRows)
                            {
                                // 9. 循环读取每一行数据
                                while (reader.Read())
                                {
                                    // 10. 通过列名或索引获取数据
                                    int id = reader.GetInt32("id");
                                    string name = reader.GetString("name");
                                    string email = reader.IsDBNull(reader.GetOrdinal("email")) ? null : reader.GetString("email"); // 安全处理NULL值

                                    Console.WriteLine($"ID: {id}, Name: {name}, Email: {email}");
                                }
                            }
                            else
                            {
                                Console.WriteLine("No records found.");
                            }
                            // 11. Reader 会在 using 块结束时自动关闭
                        }
                    }
                }
                catch (MySqlException ex)
                {
                    // 处理 MySQL 特定的异常
                    Console.WriteLine($"MySQL Error {ex.Number}: {ex.Message}");
                }
                catch (Exception ex)
                {
                    // 处理其他异常
                    Console.WriteLine($"General error: {ex.Message}");
                }
                // 12. Connection 会在 using 块结束时自动关闭和释放
            }
            Console.ReadLine();
        }
    }
}

三、 在 ​​ASP.NET​​ Core 中的最佳实践

在现代 ​​ASP.NET​​ Core 应用程序中,我们使用依赖注入 (Dependency Injection) 来管理数据库连接,这是更优雅和高效的方式。

#1. 在 ​​appsettings.json​​ 中配置连接字符串

{
  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;port=3306;database=myappdb;user=myappuser;password=MyStrongPassword!;charset=utf8mb4;"
  },
  // ... other settings
}

#2. 在 ​​Program.cs​​ 中注册 MySQL 服务

using MySql.Data.MySqlClient;
using System.Data;

var builder = WebApplication.CreateBuilder(args);

// 添加服务到容器
builder.Services.AddControllers();

// 注册 MySqlConnection,将其作为瞬态(Transient)服务
// 每次请求都会创建一个新的连接实例,ADO.NET 的连接池会管理底层连接的效率
builder.Services.AddTransient<IDbConnection>((sp) =>
{
    var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
    return new MySqlConnection(connectionString);
});

var app = builder.Build();
// ... 后续中间件配置

#3. 在控制器 (Controller) 或服务层中使用

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly IDbConnection _db;

    // 通过构造函数注入 IDbConnection
    public UsersController(IDbConnection db)
    {
        _db = db;
    }

    [HttpGet]
    public async Task<IActionResult> GetUsers()
    {
        var users = new List<User>();
        // 使用 Dapper 简化数据操作(推荐)
        // users = await _db.QueryAsync<User>("SELECT * FROM Users"); 

        // 或者使用原生 ADO.NET
        await _db.OpenAsync();
        using (var command = new MySqlCommand("SELECT * FROM Users", (MySqlConnection)_db))
        {
            using (var reader = await command.ExecuteReaderAsync())
            {
                while (await reader.ReadAsync())
                {
                    users.Add(new User
                    {
                        Id = reader.GetInt32("Id"),
                        Name = reader.GetString("Name")
                    });
                }
            }
        }
        return Ok(users);
    }
}

四、 关键注意事项与最佳实践

  1. 连接池 (Connection Pooling)
  • ​MySql.Data​​ 默认启用了连接池。这意味着当你创建和关闭 ​​MySqlConnection​​ 对象时,底层物理连接并不会立即关闭,而是被放入池中备用,从而大幅提升性能。
  • 务必使用 using​ 语句或在 ​​ASP.NET​​ Core 中通过依赖注入来管理连接,以确保连接总是被正确关闭并返回到池中。避免手动调用 ​​.Open()​​ 而不调用 ​​.Close()​​。
  1. 参数化查询
  • 永远不要使用字符串拼接来构造 SQL 查询语句,这会导致严重的 SQL 注入漏洞
  • 始终像示例中那样使用 ​​MySqlParameter​​ 或 ​​Parameters.AddWithValue()​​。
  1. 异步编程
  • 对于 Web 应用程序,使用异步方法(​​OpenAsync()​​, ​​ExecuteReaderAsync()​​, ​​ReadAsync()​​)可以避免阻塞线程,提高应用程序的并发能力和可扩展性。
  1. 错误处理
  • 使用 ​​try-catch​​ 块来捕获 ​​MySqlException​​,它可以提供具体的错误编号(​​ex.Number​​),便于排查身份验证、服务器连接等特定问题。
  1. 使用 ORM(对象关系映射器)
  • 对于复杂的应用程序,考虑使用像 Dapper(轻量、高性能)或 Entity Framework Core(功能全面、官方支持)这样的 ORM。它们可以简化数据访问代码。
  • EF Core 同样可以通过 ​​Pomelo.EntityFrameworkCore.MySql​​ 提供程序来支持 MySQL。

总结

在 C# 中连接 MySQL 的步骤可以概括为:

  1. 安装​MySql.Data​​ NuGet 包。
  2. 配置安全的连接字符串(存储在配置文件中)。
  3. 使用 using​ 语句创建和销毁 ​​MySqlConnection​​ 对象以利用连接池。
  4. 使用 MySqlCommand​ 和 ​MySqlParameter​​ 执行参数化查询。
  5. ​ASP.NET​​ Core 中,通过依赖注入在 ​​Program.cs​​ 中注册 ​​IDbConnection​​,并在控制器中获取使用。

遵循这些步骤和最佳实践,您就可以在 C# 应用程序中高效、安全地与 MySQL 数据库进行交互。

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

更多推荐