为何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() } } }
关键修正点说明
- 把数据库操作核心代码全部放入
try块,确保异常能被捕获处理。 - 使用
using块管理连接和命令,自动释放资源,避免内存泄漏和连接未关闭问题。 - 检查
ExecuteNonQuery()的返回值,准确判断是否有数据被更新。 - 直接使用方法参数
phsc的属性值,避免变量不匹配导致的无效操作。 - 参数化SQL既避免了注入风险,又能保证数据类型的正确性(比如数字类型无需手动加引号)。
内容的提问来源于stack exchange,提问作者Senneth Ho
相关产品推荐
相关产品推荐

