You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)字段,用来区分不同用户和测试任务。

实现步骤

  1. 开启数据库事务,保证两个积分更新操作的原子性(要么全部成功,要么全部回滚)。
  2. 查询当前测试的最后一条记录(即上一位完成测试的用户记录),并更新其积分。
  3. 处理当前新用户的积分:若该用户已有该测试的记录则更新积分,无记录则插入新记录并初始化积分。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:31:23