Что я упустил в отношении синтаксиса оператора SQL? - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу код для вставки имени пользователя и пароля в базу данных с именем Users.

Когда я пытаюсь запустить код, он говорит, что в синтаксисе оператора INSERT есть ошибка, но я не могу в течение жизния нашел его.

Я выполняю инструкцию SQL, используя другую функцию, называемую RunSQL, которую я могу отправить, если это необходимо, но она отлично работает с любым другим оператором SQL, с которым я работал.

Таблица Users содержит следующие столбцы с типом данных User_ID - Auto Number (Primary Key). Имя пользователя - Short Text Password - Short Text

Я попытался добавить '' вокруг значений, которые я собираюсь вставить в таблицу кака также удаление & и сделать его одной непрерывной строкой.Я попытался добавить / удалить;но ничего не помогло.

Dim sql As String = "INSERT INTO Users (Username, Password) " &           
"VALUES (" & username_Textbox.Text & " , " & password_Textbox.Text & ");"
RunSQL(sql)
MessageBox.Show("User Added")

Private Sub RunSQL(ByVal sql As String)
    Dim conn As OleDbConnection = New 
    OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Paper_Gen_Database.accdb;")
    conn.Open()
    Dim cmd As New OleDbCommand(sql, conn)
    cmd.ExecuteNonQuery()
    System.Threading.Thread.Sleep(500)
End Sub

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

Так выглядит оператор SQL, когда «bh106» - это имя пользователя, а «ZLTga» - пароль.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Это один из способов использования параметров.Очень важно использовать параметры, потому что в противном случае вы рискуете ввести SQL-код, который может испортить вашу базу данных.На самом деле гораздо проще написать оператор SQL таким образом, потому что вам не нужно беспокоиться о правильности всех ваших кавычек в строке.

Блоки Using...End Using гарантируют, что ваши объекты базы данных закрыты.и утилизировать, даже если есть ошибка.Это важно, потому что освобождает любые неуправляемые ресурсы, которые используются.

В реальном приложении вы никогда не сохраните пароли в виде простого текста, но это тема для другого дня.

Private Sub InsertUser()
    Dim sql As String = "INSERT INTO Users (Username, [Password]) VALUES (@username, @password);"
    Using conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Paper_Gen_Database.accdb;")
        Using cmd As New OleDbCommand(sql, conn)
            cmd.Parameters.Add("@username", OleDbType.VarChar).Value = username_Textbox.Text
            cmd.Parameters.Add("@password", OleDbType.VarChar).Value = password_Textbox.Text
            conn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
    MessageBox.Show("User Added")
End Sub

В Accessпорядок добавления параметров должен соответствовать порядку их появления в операторе SQL.

0 голосов
/ 01 февраля 2019

Попробуйте это (вероятно, из-за отсутствия кавычек, а также из-за того, что пароль защищен словом):

Dim sql As String = "INSERT INTO Users (Username, [Password]) " &           
"VALUES ('" & username_Textbox.Text & "' , '" & password_Textbox.Text & "');"
RunSQL(sql)
MessageBox.Show("User Added")

Также следует помнить о проблеме внедрения SQL.Если пользователь поместит кавычку в текстовое поле, вставка все равно будет неудачной.

Вам следует попытаться преобразовать свой код в параметризованный запрос, например:

https://docs.microsoft.com/pl-pl/dotnet/api/system.data.oledb.oledbcommand.parameters?view=netframework-4.7.2

...