Member 13363527 Ответов: 2

Ошибка исключения первого шанса


Я собираюсь добавить некоторые данные в ms access 2010 с помощью vb.net и я получаю следующее сообщение об ошибке во время выполнения.

"Первый шанс исключение типа 'System.Данных.Oledb. OleDbException ' произошло в System.Data.dll"

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

Мой код таков;

Imports System.Data.OleDb
Public Class Form1

Private Sub cmdcancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdcancel.Click
        Close()
    End Sub

    Private Sub cmdadd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdadd.Click
        Try
            Dim sqlconn As New OleDb.OleDbConnection
            Dim sqlquery As New OleDb.OleDbCommand
            Dim connString As String
            connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Tubewell\Tubewell\Tubewell.accdb"
            sqlconn.ConnectionString = connString
            sqlquery.Connection = sqlconn
            sqlconn.Open()
            sqlquery.CommandText = "INSERT INTO Employee_Details(EmpNo,Employee Name,Status) VALUES ('" & txtempno.Text & "','" & txtempname.Text & "','" & ComboBox1.Text & "')"
            sqlquery.ExecuteNonQuery()
            sqlconn.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
End Class

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]

Исправьте это, и это, вероятно, исправит OleDbException также.

Michael_Davies

Ваш проект 64-битный или 32-битный?

Member 13363527

64бит

Michael_Davies

Установите его на 32 бита и посмотрите, исправляет ли он, первые случайные ошибки возникают при загрузке ресурсов (в данном случае OLEDB), Microsoft.ACE.OLEDB.12.0-32 бита. Много статей на эту тему вот одна из них использует то же самое для Excel; https://blogs.msdn.microsoft.com/farukcelik/2010/06/04/accessing-excel-files-on-a-x64-machine/

2 Ответов

Рейтинг:
2

Richard Deeming

Начните с фиксации SQL-инъекция[^] уязвимость.

Вам также нужно будет завернуть Employee Name поле в квадратных скобках. Как правило, следует избегать создания столбцов или таблиц с пробелами или другими специальными символами в их названии.

Вы должны обернуть объекты соединения и команды в Using блоки, чтобы убедиться, что они всегда очищены должным образом.

Private Sub cmdadd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdadd.Click
    Try
        Using sqlconn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Tubewell\Tubewell\Tubewell.accdb")
            Using sqlquery As New OleDb.OleDbCommand("INSERT INTO Employee_Details(EmpNo, [Employee Name], Status) VALUES (?, ?, ?)", sqlconn)
                sqlquery.Parameters.AddWithValue("@EmpNo", txtempno.Text)
                sqlquery.Parameters.AddWithValue("@Name", txtempname.Text)
                sqlquery.Parameters.AddWithValue("@Status", ComboBox1.Text)
                 
                sqlconn.Open()
                sqlquery.ExecuteNonQuery()
            End Using
        End Using
    
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

Если вы все еще получаете исключение, установите точку останова на MessageBox.Show постройте и изучите все детали исключения.


Member 13363527

Сделано. Это работает. Большое спасибо.

Karthik_Mahalingam

если работает, пожалуйста, отметьте его как ответ, нажав кнопку принимать кнопка.

Рейтинг:
2

Patrice T

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