避坑指南:C#连接MySQL时常被忽略的三大要点(连接池、参数化查询、异常处理)
在 C# 中连接 MySQL 数据库是一项非常常见的任务。下面我将为您提供一个从基础到进阶的完整指南,包括环境配置、代码实现、最佳实践和常见问题处理。
一、 选择连接器(驱动)
在 C# (.NET) 中连接 MySQL,官方推荐使用 MySQL Connector/NET,这是一个完全托管的 ADO.NET 驱动程序。现在它主要通过 NuGet 包进行分发,包名称为:
-
MySql.Data
#安装 NuGet 包
在您的 C# 项目(如 Console App, ASP.NET Core 等)中,通过以下方式安装:
- Visual Studio:右键点击项目 -> “管理 NuGet 程序包” -> 搜索 “
MySql.Data” -> 安装。 - .NET CLI:在终端中运行以下命令:
dotnet add package MySql.Data
二、 基础连接代码(ADO.NET 方式)
这是最直接、最可控的方式,类似于连接 SQL Server 的方式。
#1. 引入必要的命名空间
using MySql.Data.MySqlClient; // 核心命名空间
using System.Data; // 可选,用于 DataTable 等类
#2. 构建连接字符串(Connection String)
连接字符串包含连接到数据库所需的所有信息。以下是关键参数:
|
参数 |
描述 |
示例 |
|
|
MySQL 服务器地址 |
|
|
|
端口号(可选,默认 3306) |
|
|
|
要连接的数据库名称 |
|
|
|
用户名 |
|
|
|
密码 |
|
|
|
字符集(强烈建议设置) |
|
示例连接字符串:
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);
}
}
四、 关键注意事项与最佳实践
- 连接池 (Connection Pooling):
-
MySql.Data 默认启用了连接池。这意味着当你创建和关闭 MySqlConnection 对象时,底层物理连接并不会立即关闭,而是被放入池中备用,从而大幅提升性能。 - 务必使用
using 语句或在 ASP.NET Core 中通过依赖注入来管理连接,以确保连接总是被正确关闭并返回到池中。避免手动调用 .Open() 而不调用 .Close()。
- 参数化查询:
- 永远不要使用字符串拼接来构造 SQL 查询语句,这会导致严重的 SQL 注入漏洞。
- 始终像示例中那样使用
MySqlParameter 或 Parameters.AddWithValue()。
- 异步编程:
- 对于 Web 应用程序,使用异步方法(
OpenAsync(), ExecuteReaderAsync(), ReadAsync())可以避免阻塞线程,提高应用程序的并发能力和可扩展性。
- 错误处理:
- 使用
try-catch 块来捕获 MySqlException,它可以提供具体的错误编号(ex.Number),便于排查身份验证、服务器连接等特定问题。
- 使用 ORM(对象关系映射器):
- 对于复杂的应用程序,考虑使用像 Dapper(轻量、高性能)或 Entity Framework Core(功能全面、官方支持)这样的 ORM。它们可以简化数据访问代码。
- EF Core 同样可以通过
Pomelo.EntityFrameworkCore.MySql 提供程序来支持 MySQL。
总结
在 C# 中连接 MySQL 的步骤可以概括为:
- 安装
MySql.Data NuGet 包。 - 配置安全的连接字符串(存储在配置文件中)。
- 使用
using 语句创建和销毁 MySqlConnection 对象以利用连接池。 - 使用
MySqlCommand 和 MySqlParameter 执行参数化查询。 - 在 ASP.NET Core 中,通过依赖注入在
Program.cs 中注册 IDbConnection,并在控制器中获取使用。
遵循这些步骤和最佳实践,您就可以在 C# 应用程序中高效、安全地与 MySQL 数据库进行交互。
另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

更多推荐


所有评论(0)