执行MS Access SQL更新无报错但未更新数据的原因排查
先贴一下你提供的代码片段:
Table structure Update query Dim cmd As New OleDb.OleDbCommand cmd.CommandText = " UPDATE [leadsonline_stores] SET [db_Path] = @db_Path,[Image_Path] = @Image_Path,[lo_Username] = @lo_Username,[lo_Password] = @lo_Password,[lo_Store] = @lo_Store,[Notes] = @Notes,[lo_Active] = @lo_Active WHERE [ID] = @ID " cmd.Connection = dbMai...
遇到这种“执行不报错但数据没变化”的情况,我帮你梳理几个最可能的原因,你可以逐一排查:
WHERE子句没匹配到任何记录:这是头号嫌疑!你传入的
@ID参数值可能不对——要么是ID值在表中根本不存在,要么是参数类型和表中ID字段的类型不匹配(比如ID是数字型,但你传了字符串格式的数字)。建议先单独运行一条SELECT * FROM [leadsonline_stores] WHERE [ID] = 你的实际ID值语句,确认有没有对应的行。参数绑定顺序/类型出错:OleDb不支持按参数名称匹配,而是严格按照SQL语句中参数出现的顺序来绑定参数!你的SQL里参数顺序是
@db_Path→@Image_Path→@lo_Username→@lo_Password→@lo_Store→@Notes→@lo_Active→@ID,如果绑定参数的时候顺序搞反了(比如把@ID绑在了前面),就会导致WHERE子句匹配不到,或者更新了错误的字段值。另外还要检查参数类型是否和表字段一致,比如lo_Active如果是布尔型,别传字符串"True",要传Boolean类型的值。事务没提交:如果你的代码里用到了
OleDbTransaction开启了事务,但执行完Update后忘了调用transaction.Commit(),那所有修改都会被回滚,表自然没变化。检查一下有没有事务相关的代码逻辑。连接到了错误的数据库文件:你给
cmd.Connection赋值的dbMai是不是指向了另一个Access文件?比如路径写错了,或者连接的是备份文件,导致更新操作执行在了别的库上,而你查看的是原来的库。可以输出dbMai.ConnectionString看看实际连接的文件路径对不对。更新的字段值和原数据完全一致:如果你要设置的新值和字段当前值一模一样,数据库不会执行“无意义”的更新,所以看起来表没变化。可以在执行Update前先查询对应ID的记录,对比新旧值是否有差异。
数据库文件只读或无写入权限:检查Access文件的属性是不是被设为只读了,或者存放文件的文件夹没有写入权限。这种情况下,执行语句不会报错,但实际无法写入数据,右键文件属性看看权限设置。
驱动兼容性问题:确认你用的OleDb驱动版本和Access文件版本兼容,比如Access 2007及以后的accdb文件需要用ACE驱动,而不是旧的Jet驱动。
内容的提问来源于stack exchange,提问作者PyDeveloper

