Как исправить синтаксическую ошибку в инструкции INSERT INTO в v bnet? - PullRequest
0 голосов
/ 05 марта 2020

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

    Dim dsNewRow As DataRow
    Dim ds As New DataSet

    Dim con As New OleDbConnection

    con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"
    con.Open()

    Dim sql As String = "SELECT * FROM manager_login_data"

    Dim da As New OleDbDataAdapter(sql, con)

    Dim cb As New OleDb.OleDbCommandBuilder(da)


    da.Fill(ds, "manager_login_data")

    dsNewRow = ds.Tables("manager_login_data").NewRow()

    dsNewRow.Item("username") = TextBox1.Text
    dsNewRow.Item("password") = TextBox2.Text



    ds.Tables("manager_login_data").Rows.Add(dsNewRow)


    da.Update(ds, "manager_login_data")

Я хочу знать, что мне нужно сделать, чтобы это исправить и запустить мою программу. Ошибка происходит в строке da.Update.

РЕДАКТИРОВАТЬ: я обнаружил, что необходимо изменить команду sql, что я даю da.

Мне просто нужно знать в что.

РЕДАКТИРОВАТЬ 2:

My access database

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Вы обращаетесь к базе данных дважды, один раз методом .Fill и один раз .Update. Все накладные расходы DataAdapters, DataSets, DataTables и CommandBuilders не являются необходимыми. Если все, что вы хотите сделать, это добавить одного пользователя, то следующие шаги будут выполнены sh this.

  1. Создайте соединение, передав строку подключения конструктору.

  2. Создайте команду, передающую текст команды и соединение с конструктором.

  3. Создайте параметры, передающие имя параметра, тип данных и размер поля методу .Add и установить значения. Я должен был угадать тип данных и размер поля. Обратитесь к базе данных, чтобы узнать действительные значения, и откорректируйте код соответствующим образом.

  4. Откройте соединение и выполните команду.

Я экранировал пароль с скобки в выражении Sql, как указано @jmcilhinney в его ответе.

Private Sub InsertNewUser()
    Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"),
            cmd As New OleDbCommand("Insert Into manager_login_data (username, [password]) Values (?,?);", con)
        With cmd.Parameters
            .Add("@user", OleDbType.VarChar, 100).Value = TextBox1.Text
            .Add("@password", OleDbType.VarChar, 100).Value = TextBox2.Text
        End With
        con.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

EDIT

Попробуйте поставить DataGridView на Form и запустите следующий код после выполнения InsertNewUser.

Private Sub FillGrid()
    Dim dt As New DataTable
    Using con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\POS DATABASE.mdb"),
        cmd As New OleDbCommand("Select * From manager_login_data;")
        con.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    DataGridView1.DataSource = dt
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    FillGrid()
End Sub
1 голос
/ 05 марта 2020

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

Первый и лучший вариант - изменить имена столбцов. Вы никогда не должны использовать пробелы или специальные символы в именах столбцов, и вы должны избегать зарезервированных слов. Похоже, что это данные для входа в Access, что делает вероятным, что один из ваших столбцов называется Password. Это действительно зарезервированное слово в Jet SQL. Если бы вы все делали правильно, то для начала вы бы не хранили пароли в виде открытого текста, а вместо этого хешировали их. В этом случае столбец может иметь имя PasswordHash и проблема исчезнет. Если вы не можете изменить имя столбца на более подходящее, попробуйте другой вариант.

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

Dim sql As String = "SELECT UserName, [Password] FROM manager_login_data"

Третий вариант - сообщить сборщику команд, чтобы он избегал имени каждого столбца. , что позволяет вам продолжать использовать подстановочные знаки в вашем запросе. Вы делаете это, устанавливая свойства QuotePrefix и QuoteSuffix. Как видно из приведенного выше примера SQL, префикс представляет собой открывающую скобку, а суффикс - закрывающую скобку. Некоторые другие базы данных могут использовать разные символы, например, MySQL использует могилу для обоих. Например,

With cb
    .QuotePrefix = "["
    .QuoteSuffix = "]"
End With

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

Dim cb As New OleDbCommandBuilder(da) With {.QuotePrefix = "[",
                                            .QuoteSuffix = "]"}
...