OleDbException не было обработано; Ошибка в .ExecuteNonQuery в vb

Я просто новичок в 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

person mikhael1098    schedule 12.03.2016    source источник
comment
Подсчитайте вопросительные знаки в своем запросе, а затем подсчитайте параметры в своем коде.....   -  person Steve    schedule 12.03.2016


Ответы (1)


В коллекции параметров отсутствует параметр. Есть четыре заполнителя параметров (?), но вы добавляете в коллекцию только три параметра.
Вам нужно добавить последний, тот, который используется в предложении 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