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

System.Data.OleDb.OleDbException缺少运算符 保存DataGridView修改报错

报错触发原因

System.Data.OleDb.OleDbException: 'Syntax error (missing operator) in query expression '((BookingID = ?) AND ((? = 1 AND RoomType IS NULL) OR (RoomType = ?)) AND ((? = 1 AND Check-In IS NULL) OR (Check-In = ?)) AND ((? = 1 AND Checkout IS NULL) OR (Checkout = ?)) AND ((? = 1 AND NoNights IS NULL) OR (NoNights = ?)) AND ((? = 1 AND Adults IS '.')

核心原因是数据库表tblRoomBookings的Check-In字段名包含特殊字符横杠-,你使用的OleDbCommandBuilder自动生成更新语句时,默认不会给包含特殊字符、空格、SQL保留关键字的字段名添加转义符号,生成的SQL中Check-In会被OleDb解析为「Check减In」的运算表达式,完全不符合字段引用语法,因此触发缺少运算符的报错。

解决方案

有两种可选方案,按需选择即可:

  • 方案1:修改数据库字段命名(彻底解决)
    将tblRoomBookings表的Check-In字段重命名为不含特殊字符的格式,比如CheckIn,同步调整业务代码中涉及该字段的查询逻辑即可,后续自动生成的SQL不会再出现转义问题。
  • 方案2:强制命令生成器添加字段转义符(无需修改数据库结构)
    修改LoadGrid方法中生成更新命令的代码,给OleDbCommandBuilder指定转义前缀和后缀,强制所有字段名用方括号包裹:
    ' 替换原有生成UpdateCommand的代码
    Dim cmdBuilder As New OleDb.OleDbCommandBuilder(DB.DBDA)
    cmdBuilder.QuotePrefix = "["
    cmdBuilder.QuoteSuffix = "]"
    DB.DBDA.UpdateCommand = cmdBuilder.GetUpdateCommand()
    
    修改后自动生成的SQL会将Check-In包裹为[Check-In],OleDb可以正确识别为字段名,语法错误会直接消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:45:05