1

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

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
4

1 回答 1

2

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

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

在您的情况下,您始终将字符串作为参数值传递,但我很确定您的数据库字段并非都是字符串。
在这种情况下AddWithValue,无法知道特定参数是否将用于更新数字、日期时间或布尔字段,因此查看值的数据类型以确定参数的数据类型。

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

在这篇博客文章中查看更多信息我们可以停止使用 AddWithValue 了吗?

最好始终使用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,每个 Add 中使用的确切数据应该与列的实际数据类型相匹配。

于 2016-03-12T13:12:49.733 回答