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类型参数,需要确认实际运行代码是否存在类型不匹配的问题。
修复方案
- 调整参数添加顺序,严格和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
- 显式处理可空布尔赋值,避免隐式转换异常:
修改点击事件中UserActive的赋值逻辑:
.UserActive = cbx_active.IsChecked.GetValueOrDefault(False)
- 确认Bridge类的声明与调用逻辑完全对应,避免传值时的类型匹配错误。
内容的提问来源于stack exchange,提问作者Tanish Ranjan
相关产品推荐
相关产品推荐

