在 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,簡單便捷。可以大大地提高工作效率喔。