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

时间:2016-03-12 12:52:18

标签: vb.net oledbexception

我只是vb.net中的新手 但是我的代码出了什么问题,cmd.ExecuteNonQuery中存在错误,并且说没有给出一个或多个必需参数的值。我该如何处理,请帮忙。我已经检查了包含此问题的所有论坛,但它们都不适合我的代码问题。请帮助。

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

1 个答案:

答案 0 :(得分:2)

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

但是从这个微不足道的错误中,你需要在使用AddWithValue时付出很多关注,因为当你没有正确指定参数值时,该方法会出现意外行为。

在您的情况下,您始终将字符串作为参数值传递,但我非常确定您的数据库字段不是所有字符串。
在此上下文中,AddWithValue无法知道是否将使用特定参数来更新数字,日期时间或布尔字段,从而查看值的数据类型以确定参数的数据类型。

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

在此博客文章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子句中使用的相同值

当然,每个Add中使用的确切OleDbType应与列的实际数据类型匹配。