C# WinForm中MySQL最后记录+1及指定用户加分实现问询
问题解决方案
一、更新MySQL最后一条记录的balls字段加1
实现思路
假设journal表的id是自增主键,最后一条记录即id值最大的记录。通过ORDER BY id DESC LIMIT 1定位这条记录后执行更新操作。
C# WinForm代码实现
using MySql.Data.MySqlClient; // 执行更新最后一条记录的积分操作 using (MySqlConnection conn = db.getConnection()) { conn.Open(); // 构造SQL:按id降序取第一条记录,将其balls字段加1 string updateSql = "UPDATE `journal` SET `balls` = `balls` + 1 ORDER BY `id` DESC LIMIT 1;"; using (MySqlCommand command = new MySqlCommand(updateSql, conn)) { // 执行更新,返回受影响行数,可用于判断更新是否成功 int affectedRows = command.ExecuteNonQuery(); } }
二、为完成同一测试的最后一位用户增加积分(结合场景实现)
场景说明
当新用户完成测试时,需要给上一位完成该测试的用户和当前新用户同时增加积分。需确保journal表包含user_id(用户ID)、test_id(测试ID)字段,用来区分不同用户和测试任务。
实现步骤
- 开启数据库事务,保证两个积分更新操作的原子性(要么全部成功,要么全部回滚)。
- 查询当前测试的最后一条记录(即上一位完成测试的用户记录),并更新其积分。
- 处理当前新用户的积分:若该用户已有该测试的记录则更新积分,无记录则插入新记录并初始化积分。
C# WinForm代码实现
using MySql.Data.MySqlClient; /// <summary> /// 用户完成测试后,为上一位完成用户和当前用户添加积分 /// </summary> /// <param name="currentUserId">当前完成测试的用户ID</param> /// <param name="testId">对应的测试ID</param> public void AddPointsOnTestFinish(int currentUserId, int testId) { using (MySqlConnection conn = db.getConnection()) { conn.Open(); // 开启事务,避免部分操作成功、部分失败的情况 using (MySqlTransaction transaction = conn.BeginTransaction()) { try { // 1. 查询同一测试的最后一条记录ID int lastRecordId = -1; string selectLastRecordSql = "SELECT id FROM `journal` WHERE `test_id` = @testId ORDER BY `id` DESC LIMIT 1;"; using (MySqlCommand selectCmd = new MySqlCommand(selectLastRecordSql, conn, transaction)) { selectCmd.Parameters.AddWithValue("@testId", testId); object result = selectCmd.ExecuteScalar(); if (result != null && int.TryParse(result.ToString(), out lastRecordId)) { // 2. 为上一位完成测试的用户加积分 string updateLastUserSql = "UPDATE `journal` SET `balls` = `balls` + 1 WHERE `id` = @lastRecordId;"; using (MySqlCommand updateLastCmd = new MySqlCommand(updateLastUserSql, conn, transaction)) { updateLastCmd.Parameters.AddWithValue("@lastRecordId", lastRecordId); updateLastCmd.ExecuteNonQuery(); } } // 若没有最后一条记录(当前是第一个完成测试的用户),则跳过此步骤 } // 3. 为当前用户处理积分:先检查是否已有该测试的记录 string checkCurrentUserSql = "SELECT id FROM `journal` WHERE `user_id` = @userId AND `test_id` = @testId;"; using (MySqlCommand checkCmd = new MySqlCommand(checkCurrentUserSql, conn, transaction)) { checkCmd.Parameters.AddWithValue("@userId", currentUserId); checkCmd.Parameters.AddWithValue("@testId", testId); object result = checkCmd.ExecuteScalar(); if (result != null) { // 已有记录,更新积分 string updateCurrentSql = "UPDATE `journal` SET `balls` = `balls` + 1 WHERE `user_id` = @userId AND `test_id` = @testId;"; using (MySqlCommand updateCmd = new MySqlCommand(updateCurrentSql, conn, transaction)) { updateCmd.Parameters.AddWithValue("@userId", currentUserId); updateCmd.Parameters.AddWithValue("@testId", testId); updateCmd.ExecuteNonQuery(); } } else { // 无记录,插入新记录(初始积分设为1) string insertCurrentSql = "INSERT INTO `journal` (`user_id`, `test_id`, `balls`) VALUES (@userId, @testId, 1);"; using (MySqlCommand insertCmd = new MySqlCommand(insertCurrentSql, conn, transaction)) { insertCmd.Parameters.AddWithValue("@userId", currentUserId); insertCmd.Parameters.AddWithValue("@testId", testId); insertCmd.ExecuteNonQuery(); } } } // 提交事务 transaction.Commit(); } catch (Exception ex) { // 发生异常时回滚事务 transaction.Rollback(); // 可添加日志记录等异常处理逻辑 throw ex; } } } }
注意事项
- 必须使用参数化查询,避免SQL注入风险。
- 事务的使用能有效保证数据一致性,防止出现部分用户积分更新成功、部分失败的情况。
- 若“最后一条记录”的判定依据不是
id(比如按完成时间排序),只需调整SQL中的ORDER BY字段即可。
内容的提问来源于stack exchange,提问作者dassoff
相关产品推荐
相关产品推荐

