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

OleDb.ExecuteNonQuery始终返回0,Access数据库Boolean列更新问题求助

问题根因

1. 参数顺序不匹配(核心原因)

OleDb 本身不支持命名参数,只会按照你Parameters.Add的先后顺序,和SQL语句中占位符的出现顺序依次匹配赋值,和参数名无关。
你当前SQL语句的参数出现顺序为:
@user(UserName参数)→ @pass(UserPassword参数)→ @role(UserRole参数)→ @name(UserFullname参数)→ @active(UserActive参数)→ @id(WHERE条件的UserID参数)
但你添加参数时第一个加入的是@id,最后加入的是@active,相当于把UserID的值赋值给了UserName参数,WHERE条件里的UserID实际拿到的是UserActive的布尔值,完全匹配不到任何行,因此ExecuteNonQuery始终返回0。

2. 可空布尔类型隐式转换问题

WPF中CheckBox的IsChecked属性是Boolean?(可空布尔类型),直接赋值给非空的UserActive属性时,若IsChecked为Nothing会被隐式转为False,可能和预期不符。

3. 代码声明与调用不一致

你贴出的Bridge类为Accounts_Bridge,方法名Update、参数类型为AccountsData,但点击事件中实例化的是UsersBridge、调用UpdateUser方法、传入UsersModule类型参数,需要确认实际运行代码是否存在类型不匹配的问题。

修复方案

  1. 调整参数添加顺序,严格和SQL占位符顺序保持一致:
' 原参数添加顺序全部错误,替换为以下代码
cmd.Parameters.Add("@user", OleDbType.VarChar).Value = mc.UserName
cmd.Parameters.Add("@pass", OleDbType.VarChar).Value = mc.UserPassword
cmd.Parameters.Add("@role", OleDbType.VarChar).Value = mc.UserRole
cmd.Parameters.Add("@name", OleDbType.VarChar).Value = mc.UserFullname
cmd.Parameters.Add("@active", OleDbType.Boolean).Value = mc.UserActive
cmd.Parameters.Add("@id", OleDbType.Integer).Value = mc.UserID
  1. 显式处理可空布尔赋值,避免隐式转换异常:
    修改点击事件中UserActive的赋值逻辑:
.UserActive = cbx_active.IsChecked.GetValueOrDefault(False)
  1. 确认Bridge类的声明与调用逻辑完全对应,避免传值时的类型匹配错误。

内容的提问来源于stack exchange,提问作者Tanish Ranjan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:39:01