OleDbException 未处理; vb 中的 .ExecuteNonQuery 错误

OleDbException was unhandled; Error in .ExecuteNonQuery in vb

我只是 vb.net 的新手 但是我的代码出了什么问题,错误存在于 cmd.ExecuteNonQuery 中,它说 No value given for one or more required parameters。我该如何处理,请帮助。我已经检查了所有包含此问题的论坛,但其中 none 适合我的代码问题。请帮忙。

Dim con1 As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\Users\Admin\Documents\Visual Studio 2010\Projects\AG Hostel Room Management System1\AG Hostel Room Management System1\AGHostelRooms.accdb")
    Dim str As String
    str = "UPDATE Rooms SET [Room Number] = ? , [Room Type] = ?, Price = ?" & _
          " WHERE [Room Number] = ?"
    con1.Open()
    Using cmd = New OleDbCommand(str, con1)
        cmd.Parameters.AddWithValue("@p1", TextBox2.Text)
        cmd.Parameters.AddWithValue("@p2", TextBox3.Text)
        cmd.Parameters.AddWithValue("@p3", TextBox1.Text)
        cmd.ExecuteNonQuery()
        con1.Close()
    End Using

您的参数集合中缺少一个参数。有四个参数占位符(?),但您只将三个参数添加到集合中。
您需要添加最后一个,即 WHERE 子句中使用的那个。

但是这个微不足道的错误的一部分,在使用 AddWithValue 时需要多加注意,因为当您没有正确指定参数值时,该方法会出现意外行为。

在你的例子中,你总是传递字符串作为参数值,但我很确定你的数据库字段并不都是字符串。
在此上下文中 AddWithValue 无法知道特定参数是否将用于更新数字、日期时间或布尔字段,因此查看值的数据类型以确定参数的数据类型。

这很容易导致数据类型不匹配异常或插入错误值,尤其是日期和十进制值。这些值被发送到数据库引擎,在客户端程序的本地化 中表示,但它们可能与数据库使用的代码不兼容将字符串转换回基础列所期望的正确类型。

在这篇博客文章中查看更多信息Can we stop to use AddWithValue already?

最好始终使用 Parameters.Add 方法的特定实现,该方法允许您指定接收列的确切数据类型。
当然参数值应该是正确的数据类型。

Dim str As String
str = "UPDATE Rooms SET [Room Type] = ?, Price = ? WHERE [Room Number] = ?"
Using con1 = New OleDbConnection("......")
Using cmd = New OleDbCommand(str, con1)
    con1.Open()
    cmd.Parameters.Add("@p1", OleDbType.VarWChar).Value = TextBox3.Text
    cmd.Parameters.Add("@p2", OleDbType.Decimal).Value = Convert.ToDecimal(textBox1.Text)
    cmd.Parameters.Add("@p3", OleDbType.Integer).Value = Convert.ToInt32(textBox2.Text)
    cmd.ExecuteNonQuery()
End Using
End Using

请注意,我已将您的查询更改为仅使用三个参数,因为据我所知,没有必要将 Room Number 值更改为 WHERE 子句中使用的相同值

当然,每个添加中使用的确切 OleDbType 应该与您的列的真实数据类型相匹配。