执行更新代码时触发System.Data.OleDb.OleDbException异常求助
让我帮你一步步拆解这个问题,从代码里能看到几个关键的错误点,正是它们导致了这个数据库异常:
1. 字符串拼接用错了运算符
你这里的代码存在一个低级但致命的错误:
cmd.Parameters.AddWithValue("?name", Form3.NAMETextBox.Text And Form3.SURNAMETextBox.Text)
And是VB中的逻辑运算符,不是字符串拼接符!如果两个文本框内容非空,它会把文本当成布尔值True来运算,最终结果还是True——这会导致你往occupied by字段插入一个布尔值,而不是用户的姓名,直接触发数据类型不匹配的OleDbException。
正确的写法应该用&做字符串拼接,建议加个空格分开名和姓:
cmd.Parameters.AddWithValue("?name", Form3.NAMETextBox.Text & " " & Form3.SURNAMETextBox.Text)
2. OleDb参数绑定的误区:只认位置,不认名称
OleDb并不支持你写的?status这种命名占位符,它是严格按照参数添加的顺序来匹配SQL里的?。虽然你现在的参数顺序是对的(SQL里的三个?对应你添加的三个参数),但没必要给占位符加名称,直接写?就行,避免混淆。
3. 数据库资源管理不严谨
你手动调用cmd.Dispose()和myConnection.Close(),但如果ExecuteNonQuery()抛出异常,这些语句可能不会执行,导致数据库连接泄漏。推荐用Using语句自动管理资源,不管有没有异常都会正确释放:
' 重构后的连接与命令处理 Using myConnection As New OleDbConnection(connString) myConnection.Open() Dim str As String = "update [ROOMS] set [OCCUPIED]=?, [occupied by]=? Where [ROOM] = ?" Using cmd As New OleDbCommand(str, myConnection) cmd.Parameters.AddWithValue("@p1", True) ' 对应第一个?:OCCUPIED字段 cmd.Parameters.AddWithValue("@p2", Form3.NAMETextBox.Text & " " & Form3.SURNAMETextBox.Text) ' 对应第二个?:occupied by字段 cmd.Parameters.AddWithValue("@p3", ROOMTextBox.Text) ' 对应第三个?:ROOM字段 Try cmd.ExecuteNonQuery() MsgBox("done") Catch ex As Exception ' 把具体异常信息显示出来,方便排查 MsgBox($"error: {ex.Message}") End Try End Using End Using
4. DataSet更新可能存在冲突
你手动执行SQL更新后,又调用了TableAdapterManager.UpdateAll(Me.MY_HOTELDataSet),这可能导致DataSet里的旧数据覆盖你刚更新的内容,或者出现数据不一致。如果界面绑定了ROOMSBindingSource,可以在手动更新后刷新DataSet:
Me.ROOMSTableAdapter.Fill(Me.MY_HOTELDataSet.ROOMS)
或者干脆统一用TableAdapter来执行更新,避免混合两种更新方式。
额外建议:先看具体异常信息
把Catch块里的MsgBox("error")改成显示具体异常内容,这样能直接看到数据库返回的错误提示(比如“数据类型不匹配”“字段不存在”),更快定位问题。
内容的提问来源于stack exchange,提问作者MCHATS55

