matt09524 Ответов: 3

Проблема с вставкой данных в базу данных ACCESS.


У меня возникли проблемы с вставкой данных в базу данных ACCESS. Приведенный ниже код-это то, что я использую, но он создает исключение. Что-то вроде "количество значений запроса и полей назначения не совпадают."

<pre lang="vb"> Dim cmd As OleDbCommand = New OleDbCommand

        cmd.CommandType = CommandType.Text
        cmd.Connection = myConnection
        cmd.CommandText = "INSERT INTO users VALUES ('" & tbUsername.Text & "', '" & tbPassword1.Text & "', '" & cbRole.SelectedItem & "');"

        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "username"
        cmd.Parameters.Item("username").Value = tbUsername.Text
        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "pwd"
        cmd.Parameters.Item("pwd").Value = tbPassword1.Text
        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "role"
        cmd.Parameters.Item("role").Value = cbRole.SelectedItem

        myConnection.Open()
        Try
            cmd.ExecuteNonQuery()
        Catch ex As OleDb.OleDbException
            MsgBox(ex.Message)
        End Try

        myConnection.Close()


Любые мысли были бы полезны. Я здесь в полной растерянности...

Что я уже пробовал:

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

Я прошелся по этому коду несколько раз, и мне кажется, что он должен работать, и я проверил, что в таблице есть только 3 столбца, и я передаю только три переменные для записи в таблицу.

Richard Deeming

Как только вы это исправите, вам нужно будет исправить то, как вы храните пароли:

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - все правильно[^]

matt09524

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

Но читать информацию там было приятно. Похоже, я пойду с Libsodium, если вы не порекомендуете что-то получше?

3 Ответов

Рейтинг:
2

matt09524

Это последний код, с которым я пошел, и он работает... не знаю, как и почему.

Dim cmd As OleDbCommand = New OleDbCommand

        cmd.CommandType = CommandType.Text
        cmd.Connection = myConnection
        cmd.CommandText = "INSERT INTO users (username,pwd,role) VALUES ('" + tbUsername.Text + "','" + tbPassword1.Text + "','" + cbRole.SelectedItem + "')"

        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "username"
        cmd.Parameters.Item("username").Value = tbUsername.Text
        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "pwd"
        cmd.Parameters.Item("pwd").Value = tbPassword1.Text
        cmd.Parameters.Add(cmd.CreateParameter).ParameterName = "role"
        cmd.Parameters.Item("role").Value = cbRole.SelectedItem

        myConnection.Open()
        Try
            cmd.ExecuteNonQuery()
        Catch ex As OleDb.OleDbException
            MsgBox(ex.Message)
            Exit Sub
        End Try

        myConnection.Close()

        MsgBox("User information has been saved.")

        fill_listbox()
        tbUsername.Clear()
        tbPassword1.Clear()
        tbPassword2.Clear()
        cbRole.Items.Clear()
        tbUsername.Focus()


Рейтинг:
0

Suvendu Shekhar Giri

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

cmd.CommandText = "INSERT INTO users VALUES (@username, @pwd, @role);"


Надеюсь, это поможет :)


Рейтинг:
0

matt09524

На самом деле я починил его вот так:

cmd.CommandText = "INSERT INTO users (username,pwd,role) VALUES ('" + tbUsername.Text + "','" + tbPassword1.Text + "','" + cbRole.SelectedItem + "')"


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


Suvendu Shekhar Giri

Ну, "пробелы" никогда не могли быть причиной ошибки здесь. Вы можете проверить еще раз?
очень важно :
Ваш код уязвим для SQL-инъекция[^]

Я бы предложил вместо этого перейти к параметризованному запросу или хранимой процедуре.

matt09524

Можете ли вы объяснить параматериализованные запросы? Вы хотите удалить значения из оператора insert? Если да, то что я поставлю на их место? В последний раз, когда я занимался OLE-программированием, это было немного по-другому, поэтому я пытаюсь найти правильные методы.