在 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**:在终端中运行以下命令:
```bash
dotnet add package MySql.Data
```
二、 基础连接代码(ADO.NET 方式)
这是最直接、最可控的方式,类似于连接 SQL Server 的方式。
#1. 引入必要的命名空间
```csharp
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` (支持表情符号) |
**示例连接字符串:**
```csharp
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. 完整的连接与查询示例
以下是一个控制台应用程序的完整示例,演示了如何建立连接、执行查询并读取数据。
```csharp
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` 中配置连接字符串
```json
{
"ConnectionStrings": {
"DefaultConnection": "server=localhost;port=3306;database=myappdb;user=myappuser;password=MyStrongPassword!;charset=utf8mb4;"
},
// ... other settings
}
```
#2. 在 `Program.cs` 中注册 MySQL 服务
```csharp
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) 或服务层中使用
```csharp
[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()`。
2. **参数化查询**:
* **永远不要**使用字符串拼接来构造 SQL 查询语句,这会导致严重的 **SQL 注入漏洞**。
* **始终**像示例中那样使用 `MySqlParameter` 或 `Parameters.AddWithValue()`。
3. **异步编程**:
* 对于 Web 应用程序,使用异步方法(`OpenAsync()`, `ExecuteReaderAsync()`, `ReadAsync()`)可以避免阻塞线程,提高应用程序的并发能力和可扩展性。
4. **错误处理**:
* 使用 `try-catch` 块来捕获 `MySqlException`,它可以提供具体的错误编号(`ex.Number`),便于排查身份验证、服务器连接等特定问题。
5. **使用 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,简单便捷。可以大大地提高工作效率喔。