В коллекции параметров отсутствует параметр. Есть четыре заполнителя параметров (?), но вы добавляете в коллекцию только три параметра.
Вам нужно добавить последний, тот, который используется в предложении WHERE.
Но часть этой тривиальной ошибки заключается в том, что вам нужно уделять много внимания при использовании AddWithValue
, потому что этот метод имеет неожиданное поведение, когда вы неправильно указываете значение параметра.
В вашем случае вы всегда передаете строки в качестве значения параметра, но я почти уверен, что поля вашей базы данных не все строки.
В этом контексте AddWithValue
не может узнать, будет ли конкретный параметр использоваться для обновления числового значения. , datetime или логическое поле и, таким образом, смотрит на тип данных значения, чтобы определить тип данных параметра.
Это может легко вызвать исключение 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
для использования в каждом добавлении должен соответствовать реальному типу данных вашего столбца.
person
Steve
schedule
12.03.2016