Как отсортировать «Синтаксическая ошибка при вставке в оператор» - PullRequest
0 голосов
/ 26 января 2019

В своем проекте по информатике я использую базу данных Microsoft Access, чтобы создать приложение для викторин в Visual Basic с использованием форм Windows. Все мои операторы select (использующие oledb для подключения к базе данных) работают правильно и хорошо; но эта вставка в оператор всегда выдает «Синтаксическая ошибка в операторе вставки в», но, насколько я понимаю, в этом нет ничего плохого. Соответствующая таблица называется «Пользователи», с полями «ИД пользователя», «Имя», «Фамилия», «Имя пользователя», «Пароль», «Учитель»; где UserID - это число, учитель - логическое значение, а остальные - строки.

Когда я закончу, пароли будут хэшироваться, но так будет проще проверить, что они еще не созданы.

Я уже пытался ввести значения для идентификатора пользователя, хотя он должен автоматически увеличивать значение при вводе новой записи. И несколько разных способов создания вставки в команду.

Using oCmd As New OleDbCommand("Insert Into Users(FirstName, LastName, Username, Password, Teacher) 
    Values(@firstName, @lastName, @username, @password, 0)", myConnection)
    oCmd.Parameters.Add("@firstName", OleDbType.VarChar, 255).Value = txtFirstName.Text
    oCmd.Parameters.Add("@lastNamee", OleDbType.VarChar, 255).Value = txtLastName.Text
    oCmd.Parameters.Add("@username", OleDbType.VarChar, 255).Value = txtUsername.Text
    oCmd.Parameters.Add("@password", OleDbType.VarChar, 255).Value = txtPassword.Text
    oCmd.ExecuteNonQuery()
End Using

'txt ...'. Текст - это текстовые поля, в которых пользователь может ввести строку для значений, которые он хочет, а myConnection - это соединение с базой данных, которое уже открыто другими командами, которые выполнялись и завершались. Я ожидаю, что в таблице пользователей будет создана новая запись со значениями, введенными в текстовые поля; но вместо этого он просто выдает ошибку, указанную выше.

1 Ответ

0 голосов
/ 26 января 2019

Настоящая причина того, что ваша команда SQL не работает, заключается в том, что Password должен быть заключен в обратные символы (`), поскольку это зарезервированная строка.У меня была похожая проблема в прошлом, и мне потребовалось много времени, пока я не осознал свою ошибку.

Вы должны также использовать параметры, чтобы избежать внедрения SQL.В конце ваш код должен выглядеть следующим образом:

Using oCmd As New OleDbCommand("INSERT INTO `Users` (FirstName, LastName, Username, `Password`, Teacher) VALUES (@FirstName, @LastName, @Username, @Password, 0)", myConnection)

oCmd.Parameters.Add("@FirstName", OleDBType.VarChar, 63).Value = txtFirstName.Text
oCmd.Parameters.Add("@LastName", OleDBType.VarChar, 63).Value = txtLastName.Text
oCmd.Parameters.Add("@Username", OleDBType.VarChar, 63).Value = txtUsername.Text
oCmd.Parameters.Add("@Password", OleDBType.VarChar, 63).Value = txtPassword.Text

При добавлении параметров 63 указывает, сколько символов может взять varchar.Вы должны изменить это на сумму, которую используют переменные в вашей базе данных.

...