当前位置 主页 > 技术大全 >

    从入门到精通:C 与MySQL交互的完整代码示例与常见错误解决方案

    栏目:技术大全 时间:2025-10-16 22:16

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


1分钟搞定MySQL部署!Docker最强实操指南,含所有常用命令和配置
忘记MySQL密码怎么办?别慌!用这一招跳过验证,轻松重置管理员权限
MySQL自增主键用完怎么办?从原理到实战,全面破解开发中的高频难题
MySQL权限混乱?这几个命令让你彻底理清用户清单与权限归属
你的数据库安全吗?读懂MySQL这几种日志,关键时刻能「救你一命」
MySQL性能上不去?八成是这里没配好!手把手教你搞定my.cnf核心配置
修改MySQL字段长度别乱来!这3个核心要点和1个致命陷阱,新手必看
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(上篇)
你的MySQL数据库为什么总是又慢又卡?掌握这五大优化法则,查询速度快十倍!(下篇)