C#中SQL Update语句执行失败,Insert/Select正常求助
嘿,我看到你遇到了Update语句不生效的问题,而Insert和Select都能正常运行,这确实有点让人困惑,咱们一步步来拆解可能的原因:
先确认WHERE条件是否真的匹配到数据
这是最常见的坑!你得先验证@userid对应的steamid在目标表中确实存在,而且数据类型完全匹配(比如steamid是字符串类型,你传入的info是不是格式、大小写都和表中数据一致?)。可以先把info的值打印出来,然后直接在数据库客户端执行这条测试SQL:UPDATE [Table] SET coins = 100 WHERE steamid = '你代码里传入的info值'如果数据库里直接执行都没效果,那肯定是条件匹配的问题。
替换ExecuteScalar为ExecuteNonQuery
ExecuteScalar()主要是用来执行返回单个值的查询(比如COUNT、SUM这类聚合查询),对于Update这类不返回结果的操作,更合适的是用ExecuteNonQuery()——它会直接返回受影响的行数,能帮你快速定位问题:int affectedRows = insertCoins.ExecuteNonQuery(); // 打印出来看看,0就是没匹配到行,大于0就是更新成功了 Console.WriteLine($"更新影响的行数:{affectedRows}");如果返回大于0但你没看到数据变化,那可能是后续读取数据时用了缓存,或者你查错了表。
检查是否存在未提交的事务
如果你之前开启了数据库事务,但忘记调用Commit(),那Update的修改会被默默回滚。看看你的数据库连接cnn有没有关联事务对象,是不是漏了提交步骤?核对表名和列名的正确性
虽然你写了[Table],但要确认这是你实际操作的表名,有没有拼写错误?还有coins、steamid这两个列名,也再检查一遍——有些数据库(比如PostgreSQL)是区分大小写的,哪怕SQL Server默认不区分,也别大意。显式指定参数数据类型
AddWithValue()虽然方便,但有时候会自动推断错误的数据类型(比如把整数当成字符串传入),导致条件匹配失败。可以试试显式指定参数类型:insertCoins.Parameters.Add("@rouletteCoins", SqlDbType.Int).Value = coins; insertCoins.Parameters.Add("@userid", SqlDbType.VarChar, 64).Value = info;把
SqlDbType和长度改成你数据库里对应的类型,能避免类型不匹配的问题。
内容的提问来源于stack exchange,提问作者lunatiC

