OleDbException был необработанным … Ошибка синтаксиса в инструкции UPDATE

Я получаю эту ошибку при отладке, пожалуйста, кто-то может помочь … Ниже приведен код:

Private Sub UpdateToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateToolStripMenuItem.Click If MsgBox("Save Changes?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "WARNING") = MsgBoxResult.Yes Then Dim oleDC As New OleDbCommand With oleDC .Connection = conn .CommandText = "UPDATE tblPatientsRecord SET Names='" & txtNames.Text & _ "',Licensenumber='" & txtLicensenumber.Text & _ "',Address='" & txtAddress.Text & _ "',Fullname='" & txtFullname.Text & _ "',Birthday='" & txtBase.Text & "',Age='" & txtAge.Text & _ "',Country='" & cmbCountry.Text & "' WHERE PatientID='" & txtPatientID.Text & "'" .ExecuteNonQuery() MsgBox("Record Updated!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "SUCCESS") Disable() Clear() SaveToolStripMenuItem.Enabled = False NewToolStripMenuItem.Enabled = True LoadPatientsRecord() getLastPatientID() End With End If End Sub 

Помоги пожалуйста

One Solution collect form web for “OleDbException был необработанным … Ошибка синтаксиса в инструкции UPDATE”

Вы должны использовать параметры SQL. Это не только упростит ваш код, но и сделает некоторые виды ошибок в отношении синтаксиса и типов данных крайне маловероятными и защитит от атак SQL-инъекций:

 Dim sql =  UPDATE tblPatientsRecord SET [Names] = @p1, Licensenumber = @p2, Address = @p3, Fullname = @p4, Birthday = @p5, [Age] = @p6, Country = @p7 WHERE PatientID = @p8 .Value Using conn = New OleDbConnection(myConnStr), cmd As New OleDbCommand(sql, conn) conn.Open() cmd.Parameters.Add("@p1", OleDbType.VarChar).Value = txtNames.Text cmd.Parameters.Add("@p2", OleDbType.VarChar).Value = txtLicensenumber.Text ' ...etc cmd.Parameters.Add("@p6", OleDbType.Integer).Value = intVar cmd.Parameters.Add("@p7", OleDbType.VarChar).Value = strVar 'the last one is the WHERE cmd.Parameters.Add("@p8", OleDbType.VarChar).Value = Convert.ToInt32(lblPatientID.Text) cmd.ExecuteNonQuery() '... etc End Using 

Есть несколько других часто встречающихся проблем, к которым следует относиться.

  1. Объекты DBConnection предназначены для создания, использования и утилизации, а не для тех, которые используются снова и снова. Тем не менее, вы можете использовать глобальную строку соединения, чтобы у вас не было одинаковой строки соединения повсюду.

  2. Многие из DBObjects должны быть удалены . Using блоков закрывается и удаляет объекты соединения и команды. Как правило, если что-то имеет метод Dispose , оберните их в блок Using . Выше показано, как «складывать» 2 объекта ( OleDbConnection и OleDbCommand ) в один оператор Using который уменьшает отступ.

  3. Используйте метод Add а не AddWithValue . Это позволяет вам указать тип данных для каждого параметра. Без этого поставщик БД должен угадать, что может привести к Datatype mismatch или даже к повреждению базы данных в некоторых случаях.

  4. Предложение WHERE – это еще один параметр . Часто люди будут использовать Parameters для первой части SQL, но не обязательно конкатенация для предложения WHERE.

  5. В приведенном выше примере также используется XML-литерал для построения SQL. Это удобно для длительного сложного SQL, потому что вы можете форматировать и отступать по своему усмотрению. Вы также можете использовать несколько строк, чтобы сделать их доступными для чтения:

    Dim sql = "UPDATE tblPatientsRecord SET [Names] = @p1, " _ & "Licensenumber = @p2, " _ & "Address = @p3, "

  6. Если вы используете зарезервированные слова или пробелы SQL в именах таблиц или столбцов, вы должны избегать имен, используя [Square Brackets] как показано. Лучше не использовать ни в именах. User , Names и Values Password обычно представляют собой слова, используемые в качестве имен столбцов или таблиц, которые приводят к ошибкам синтаксиса SQL.

  7. Клещи не являются универсальными разделителями полей SQL, они фактически указывают, что переданное значение является строкой / текстом: & "Age ='" & txtAge.Text & "'" . Если для БД установлено значение « Age как число, ваш SQL передает его как текст / строку, что может привести к data type mismatch . То же самое относится к PatientID и Birthday если это поле даты.

    Общей проблемой, связывающей строки для операторов SQL, является слишком много или слишком мало тиков ( ' ) в результате. Эта возможность не выполняется с параметрами SQL.

Основная цель для SQL-параметров – это предотвратить ошибку, если имя «O’Brian» или «O’Reilly» или «Bobby», DROP TABLE tblPatientsRecord ”

Эти принципы применяются для других поставщиков БД, таких как MySql , SQLite и SQLServer . Однако такие детали, как точный символ эвакуации, будут различаться.

Обратите внимание, что Access / OleDB фактически не использует именованные параметры как таковые ( @FirstName или даже @p2 ), поэтому часто видят параметры в форме «?». Это означает, что вы должны добавить значения параметров ( Add / AddWithValue ) в том же точном порядке, что и те столбцы, которые отображаются в SQL.

Для получения дополнительной информации см .:

  • Использование заявления
  • Пул соединений
  • Как получить ВСЕ дочерние элементы формы формы Windows Forms определенного типа (Button / Textbox)?
  • Как быстро переместить объект в double ?
  • System.Data.OracleClient требует клиентского программного обеспечения Oracle версии 8.1.7
  • Скрытие и отображение вкладок в tabControl
  • Как получить размер удобочитаемого файла в аббревиатуре байтов с помощью .NET?
  • Получить сгенерированный оператор SQL из объекта SqlCommand?
  • Генератор случайных чисел Vb.net генерирует одинаковое число много раз
  • «Тени» против «Переопределения» в VB.NET
  • ObservableCollection Не поддерживает метод AddRange, поэтому я получаю уведомление для каждого добавленного элемента, кроме того, что касается INotifyCollectionChanging?
  • Обработчик исключений .NET Global в консольном приложении
  • Лучший / самый быстрый способ чтения листа Excel в DataTable?
  • Давайте будем гением компьютера.