Macusberts Ответов: 3

Как я могу решить синтаксическую ошибку в VB.NET с базой данных access


Ребята, пожалуйста, помогите мне решить эту синтаксическую ошибку при вставке данных в access from VB.net

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

Private Sub btnSaveClient_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveClient.Click
        'Validating form controls to check the NULL
        If Len(Trim(btnGenerateID.Text)) = 0 Then
            MessageBox.Show("Click The Blue Button to Generate Client ID", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            btnGenerateID.Focus()
        End If

        If Len(Trim(dtpRegtrationDate.Text)) = 0 Then
            MessageBox.Show("Eneter Registration Date", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            dtpRegtrationDate.Focus()
        End If


        If Len(Trim(cmbPhoneStatus.Text)) = 0 Then
            MessageBox.Show("Choos Phone Status", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            cmbPhoneStatus.Focus()
        End If

        If Len(Trim(cmbBrandStatus.Text)) = 0 Then
            MessageBox.Show("Chooce Brand Status", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            cmbBrandStatus.Focus()
        End If

        If Len(Trim(cmbCategory.Text)) = 0 Then
            MessageBox.Show("Chooce Category", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            cmbCategory.Focus()
        End If

        If Len(Trim(txtPhoneType.Text)) = 0 Then
            MessageBox.Show("Enter Phone Model", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtPhoneType.Focus()
        End If

        If Len(Trim(CmbSIM.Text)) = 0 Then
            MessageBox.Show("Chooce SIM Yes/No", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            CmbSIM.Focus()
        End If

        If Len(Trim(CmbSDCard.Text)) = 0 Then
            MessageBox.Show("Chooce SD Card Yes/No", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            CmbSDCard.Focus()
        End If

        If Len(Trim(txtClientID.Text)) = 0 Then
            MessageBox.Show("Click Client ID", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtClientID.Focus()
        End If

        If Len(Trim(txtClientName.Text)) = 0 Then
            MessageBox.Show("Enter Client Name", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtClientName.Focus()
        End If

        If Len(Trim(cmbGender.Text)) = 0 Then
            MessageBox.Show("Chooce Gender", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            cmbGender.Focus()
        End If

        If Len(Trim(txtLocation.Text)) = 0 Then
            MessageBox.Show("Enter Location", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtLocation.Focus()
        End If

        If Len(Trim(txtContact1.Text)) = 0 Then
            MessageBox.Show("Enter 1st Contact ", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtContact1.Focus()
        End If

        If Len(Trim(txtContact2.Text)) = 0 Then
            MessageBox.Show("Enter 2nd Contact", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtContact1.Focus()
        End If

        If Len(Trim(txtRemarks.Text)) = 0 Then
            MessageBox.Show("Enter Remarks", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
            txtRemarks.Focus()
        End If

        Try
            'Writing SQL statement to insert the values into the Database
            sql = "INSERT INTO Client Registration VALUES ('" & txtClientID.Text & "','" & dtpRegtrationDate.Text & "','" & cmbPhoneStatus.Text & "','" & cmbBrandStatus.Text & "','" & cmbCategory.Text & "','" & CmbSIM.Text & "','" & CmbSDCard.Text & "','" & txtClientName.Text & "','" & cmbGender.Text & "','" & txtLocation.Text & "','" & txtPhoneType.Text & "','" & txtContact1.Text & "','" & txtContact2.Text & "','" & txtRemarks.Text & "')"
            ''" & str & "'
            da = New OleDb.OleDbDataAdapter(sql, con)
            da.Fill(ds, "Client Registration")
            MessageBox.Show("Client Registration Sucessfully Completed", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information)

            clear()       ' Calling clear method to clear the form controls
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Exception generated", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Richard MacCutchan

Какая ошибка и где она происходит? Пожалуйста, не просто сбрасывайте груз неформатированного кода и не ожидайте, что люди сделают всю вашу работу за вас. В качестве первого прохода я должен сказать, что вы создаете свой SQL-оператор опасным образом. Никогда не используйте конкатенацию строк, но используйте правильные параметризованные запросы (Google найдет вам много статей о том, почему).

F-ES Sitecore

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

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

вставить в [регистрация клиента]

3 Ответов

Рейтинг:
1

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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


Рейтинг:
1

RmcbainTheThird

Запустите в режиме отладки, поставьте точку останова после того, как вы построили свой запрос, скопируйте запрос и запустите его в access и посмотрите, что он говорит.


Richard Deeming

И молитесь об этом Малыш Бобби таблиц[^] никогда не пытается зарегистрироваться!

Прочтите Решение 1, чтобы понять, почему это проблема.

Рейтинг:
0

Patrice T

sql = "INSERT INTO Client Registration VALUES ('" & txtClientID.Text & "','" & dtpRegtrationDate.Text & "','" & cmbPhoneStatus.Text & "','" & cmbBrandStatus.Text & "','" & cmbCategory.Text & "','" & CmbSIM.Text & "','" & CmbSDCard.Text & "','" & txtClientName.Text & "','" & cmbGender.Text & "','" & txtLocation.Text & "','" & txtPhoneType.Text & "','" & txtContact1.Text & "','" & txtContact2.Text & "','" & txtRemarks.Text & "')"

Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]