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

为何MySQL UPDATE执行后数据库未更新,却收到成功提示?

问题分析与解决

你的代码存在几个致命逻辑错误,导致弹窗提示成功但数据库无更新:

  • 异常捕获逻辑完全错误:
    你把cmd2.ExecuteNonQuery()放在了try块外面,这意味着数据库操作抛出异常时,根本不会进入你写的catch块;而不管操作是否成功、甚至连数据库连接都没打开的情况下,都会弹出"New highscore recorded"的提示,完全起不到错误判断的作用。

  • 未检查数据库操作的影响行数:
    ExecuteNonQuery()会返回受影响的行数,如果返回0,说明UPDATE语句没有匹配到任何行(比如ScoreID的值无效),但你的代码完全没处理这种情况,直接判定为成功。

  • 数据库连接可能未打开:
    代码里获取了conn2,但没有调用conn2.Open(),如果dbPlayer.GetConnection()返回的是未打开的连接,ExecuteNonQuery()根本无法执行数据库操作,操作自然不会生效。

  • 变量与方法参数不匹配:
    方法参数是PlayerScore phsc,但代码里用的是score和playersid——这两个变量如果不是从phsc中获取的正确值(比如playersid是错误的ID),UPDATE语句执行后不会修改任何数据。

  • SQL注入风险(额外提醒):
    原代码用字符串拼接生成SQL语句,存在严重的SQL注入风险,即使你试了AddWithValue,也要确保参数名和SQL语句里的占位符对应正确。


修正后的代码示例

private void UpdatePlayerScore(PlayerScore phsc)
{
    // 参数化SQL避免注入,确保变量来自方法参数
    string updateSql = "UPDATE `score` SET `PlayerScore` = @PlayerScore WHERE `ScoreID` = @ScoreID";
    
    // using块自动管理连接和命令的资源释放
    using (MySqlConnection conn2 = dbPlayer.GetConnection())
    {
        using (MySqlCommand cmd2 = new MySqlCommand(updateSql, conn2))
        {
            // 添加参数,与SQL占位符一一对应
            cmd2.Parameters.AddWithValue("@PlayerScore", phsc.PlayerScore);
            cmd2.Parameters.AddWithValue("@ScoreID", phsc.ScoreID);
            
            try
            {
                conn2.Open(); // 必须打开连接才能执行操作
                int affectedRows = cmd2.ExecuteNonQuery();
                
                if (affectedRows > 0)
                {
                    MessageBox.Show("New highscore recorded", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("No matching player found, score not updated", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show("New highscore not recorded \n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            // using块会自动关闭连接,无需手动调用conn2.Close()
        }
    }
}

关键修正点说明

  1. 把数据库操作核心代码全部放入try块,确保异常能被捕获处理。
  2. 使用using块管理连接和命令,自动释放资源,避免内存泄漏和连接未关闭问题。
  3. 检查ExecuteNonQuery()的返回值,准确判断是否有数据被更新。
  4. 直接使用方法参数phsc的属性值,避免变量不匹配导致的无效操作。
  5. 参数化SQL既避免了注入风险,又能保证数据类型的正确性(比如数字类型无需手动加引号)。

内容的提问来源于stack exchange,提问作者Senneth Ho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:25:20