当前位置:首页 > 问答 > 正文

数据库开发|数据交互 c#连接mysql数据库—C#连接MySQL数据库指南

C#连接MySQL数据库指南:轻松搞定数据交互

场景引入:当C#遇上MySQL

"小王最近接手了一个新项目,需要把公司网站的后台从SQL Server迁移到MySQL,作为C#开发老手,他第一次遇到这种组合,心里直打鼓——C#和MySQL能愉快相处吗?"

别担心!今天我们就来彻底解决这个问题,作为2025年最新的实践指南,我将带你一步步完成C#与MySQL的完美联姻。

准备工作:搭建连接桥梁

安装MySQL Connector/NET

首先需要安装MySQL官方提供的.NET连接器,截至2025年7月,最新稳定版本是8.3.0,你可以通过NuGet包管理器轻松安装:

Install-Package MySql.Data -Version 8.3.0

或者在Visual Studio的NuGet包管理界面搜索"MySql.Data"进行安装。

创建测试数据库

假设我们创建一个简单的用户管理系统数据库:

数据库开发|数据交互 c#连接mysql数据库—C#连接MySQL数据库指南

CREATE DATABASE UserManagement;
USE UserManagement;
CREATE TABLE Users (
    Id INT AUTO_INCREMENT PRIMARY KEY,
    Username VARCHAR(50) NOT NULL,
    Email VARCHAR(100) NOT NULL UNIQUE,
    CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
);

基础连接:建立第一条通道

基本连接字符串

using MySql.Data.MySqlClient;
string connectionString = "server=localhost;database=UserManagement;user=root;password=yourpassword;";
using (var connection = new MySqlConnection(connectionString))
{
    try
    {
        connection.Open();
        Console.WriteLine("连接成功!");
        // 这里可以执行数据库操作
    }
    catch (Exception ex)
    {
        Console.WriteLine($"连接失败: {ex.Message}");
    }
}

连接字符串配置最佳实践

实际项目中,我们不应该把连接字符串硬编码在代码中,推荐做法:

// 从appsettings.json读取
var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json");
var config = builder.Build();
string connectionString = config.GetConnectionString("MySQL");

对应的appsettings.json配置:

{
  "ConnectionStrings": {
    "MySQL": "server=localhost;database=UserManagement;user=appuser;password=SecurePassword123;"
  }
}

CRUD操作:数据交互四部曲

查询数据

public List<User> GetAllUsers()
{
    var users = new List<User>();
    using (var connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string query = "SELECT Id, Username, Email, CreatedAt FROM Users";
        using (var command = new MySqlCommand(query, connection))
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                users.Add(new User
                {
                    Id = reader.GetInt32("Id"),
                    Username = reader.GetString("Username"),
                    Email = reader.GetString("Email"),
                    CreatedAt = reader.GetDateTime("CreatedAt")
                });
            }
        }
    }
    return users;
}

插入数据

public int AddUser(User user)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string query = "INSERT INTO Users (Username, Email) VALUES (@username, @email)";
        using (var command = new MySqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@username", user.Username);
            command.Parameters.AddWithValue("@email", user.Email);
            return command.ExecuteNonQuery();
        }
    }
}

更新数据

public int UpdateUserEmail(int userId, string newEmail)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string query = "UPDATE Users SET Email = @email WHERE Id = @id";
        using (var command = new MySqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@email", newEmail);
            command.Parameters.AddWithValue("@id", userId);
            return command.ExecuteNonQuery();
        }
    }
}

删除数据

public int DeleteUser(int userId)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        connection.Open();
        string query = "DELETE FROM Users WHERE Id = @id";
        using (var command = new MySqlCommand(query, connection))
        {
            command.Parameters.AddWithValue("@id", userId);
            return command.ExecuteNonQuery();
        }
    }
}

高级技巧:提升你的数据库操作

使用异步方法

现代应用都应该使用异步操作避免阻塞:

public async Task<List<User>> GetAllUsersAsync()
{
    var users = new List<User>();
    using (var connection = new MySqlConnection(connectionString))
    {
        await connection.OpenAsync();
        string query = "SELECT Id, Username, Email, CreatedAt FROM Users";
        using (var command = new MySqlCommand(query, connection))
        using (var reader = await command.ExecuteReaderAsync())
        {
            while (await reader.ReadAsync())
            {
                users.Add(new User
                {
                    Id = reader.GetInt32("Id"),
                    Username = reader.GetString("Username"),
                    Email = reader.GetString("Email"),
                    CreatedAt = reader.GetDateTime("CreatedAt")
                });
            }
        }
    }
    return users;
}

事务处理

保证多个操作的原子性:

public async Task TransferUserData(int fromUserId, int toUserId)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        await connection.OpenAsync();
        using (var transaction = await connection.BeginTransactionAsync())
        {
            try
            {
                // 转移用户数据
                string updateQuery1 = "UPDATE UserPosts SET UserId = @toUserId WHERE UserId = @fromUserId";
                string updateQuery2 = "UPDATE UserComments SET UserId = @toUserId WHERE UserId = @fromUserId";
                using (var command1 = new MySqlCommand(updateQuery1, connection, transaction))
                using (var command2 = new MySqlCommand(updateQuery2, connection, transaction))
                {
                    command1.Parameters.AddWithValue("@toUserId", toUserId);
                    command1.Parameters.AddWithValue("@fromUserId", fromUserId);
                    command2.Parameters.AddWithValue("@toUserId", toUserId);
                    command2.Parameters.AddWithValue("@fromUserId", fromUserId);
                    await command1.ExecuteNonQueryAsync();
                    await command2.ExecuteNonQueryAsync();
                }
                await transaction.CommitAsync();
            }
            catch
            {
                await transaction.RollbackAsync();
                throw;
            }
        }
    }
}

使用Dapper简化操作

Dapper是一个轻量级ORM,可以大幅简化数据库操作:

// 首先安装Dapper
Install-Package Dapper
// 使用示例
public async Task<User> GetUserById(int userId)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        return await connection.QueryFirstOrDefaultAsync<User>(
            "SELECT * FROM Users WHERE Id = @id", 
            new { id = userId });
    }
}
public async Task<int> InsertUser(User user)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        return await connection.ExecuteAsync(
            "INSERT INTO Users (Username, Email) VALUES (@Username, @Email)",
            user);
    }
}

常见问题排雷指南

连接池问题

MySQL Connector/NET默认启用连接池,如果遇到连接泄漏,可以:

数据库开发|数据交互 c#连接mysql数据库—C#连接MySQL数据库指南

// 在连接字符串中控制连接池
"server=localhost;database=UserManagement;user=root;password=yourpassword;Pooling=true;Max Pool Size=100;Min Pool Size=10;Connection Lifetime=300;"

时区问题

MySQL和C#之间的时区差异可能导致日期时间问题:

// 在连接字符串中指定时区
"server=localhost;database=UserManagement;user=root;password=yourpassword;DefaultCommandTimeout=300;ConnectionTimeout=30;ConvertZeroDateTime=true;AllowZeroDateTime=false;DateTimeKind=Utc"

性能优化

对于大批量数据操作:

// 使用BulkCopy替代单条插入
public async Task BulkInsertUsers(IEnumerable<User> users)
{
    using (var connection = new MySqlConnection(connectionString))
    {
        await connection.OpenAsync();
        using (var transaction = await connection.BeginTransactionAsync())
        {
            try
            {
                foreach (var user in users)
                {
                    await connection.ExecuteAsync(
                        "INSERT INTO Users (Username, Email) VALUES (@Username, @Email)",
                        user, transaction);
                }
                await transaction.CommitAsync();
            }
            catch
            {
                await transaction.RollbackAsync();
                throw;
            }
        }
    }
}

安全注意事项

  1. 永远不要拼接SQL字符串:始终使用参数化查询防止SQL注入
  2. 最小权限原则:数据库用户只应拥有必要的最低权限
  3. 加密敏感数据:连接字符串中的密码应该加密,或使用集成身份验证
  4. 错误处理:不要向客户端暴露原始数据库错误信息

C#与MySQL的完美组合

通过本指南,你已经掌握了C#连接MySQL数据库的核心技能,从基础连接到高级事务处理,再到性能优化,这些知识足以应对大多数业务场景。

良好的数据库交互不仅仅是让代码运行,更需要考虑性能、安全和可维护性,随着.NET生态和MySQL的持续发展,这种技术组合在企业应用开发中的地位只会越来越重要。

就像开头的小王一样,你可以自信地在C#项目中使用MySQL了!遇到问题时,不妨回查这份2025年最新的实践指南,祝你编码愉快!

发表评论