"小王最近接手了一个新项目,需要把公司网站的后台从SQL Server迁移到MySQL,作为C#开发老手,他第一次遇到这种组合,心里直打鼓——C#和MySQL能愉快相处吗?"
别担心!今天我们就来彻底解决这个问题,作为2025年最新的实践指南,我将带你一步步完成C#与MySQL的完美联姻。
首先需要安装MySQL官方提供的.NET连接器,截至2025年7月,最新稳定版本是8.3.0,你可以通过NuGet包管理器轻松安装:
Install-Package MySql.Data -Version 8.3.0
或者在Visual Studio的NuGet包管理界面搜索"MySql.Data"进行安装。
假设我们创建一个简单的用户管理系统数据库:
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;" } }
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是一个轻量级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默认启用连接池,如果遇到连接泄漏,可以:
// 在连接字符串中控制连接池 "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; } } } }
通过本指南,你已经掌握了C#连接MySQL数据库的核心技能,从基础连接到高级事务处理,再到性能优化,这些知识足以应对大多数业务场景。
良好的数据库交互不仅仅是让代码运行,更需要考虑性能、安全和可维护性,随着.NET生态和MySQL的持续发展,这种技术组合在企业应用开发中的地位只会越来越重要。
就像开头的小王一样,你可以自信地在C#项目中使用MySQL了!遇到问题时,不妨回查这份2025年最新的实践指南,祝你编码愉快!
本文由 宦修文 于2025-07-31发表在【云服务器提供商】,文中图片由(宦修文)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/498712.html
发表评论