Member 14885854 Ответов: 2

Как найти синтаксическую ошибку в VB для "oledbexception was unhandled"


сэр,

я пытаюсь добавить записи в базу данных, но после нажатия на кнопку Добавить система выдает "синтаксическую ошибку" для cmd.Метод executenonquery().

плз, руководство / помощь

кодирующая часть выглядит следующим образом:-

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        If txtregno.Text = "" Then
            MsgBox("Please Enter Registration Id", MsgBoxStyle.Critical, "Registration Id is Required...!!!")
        End If
        cn.Open()
        qry = "INSERT into registration(RegNo,RegDt,Std,Div,SALUTION,SNAME,Gender,DOB,StdAdd,FatName,FatMobNo,PrvSchName,SchEnterDt,Fees,Status )values(" & txtregno.Text & ", " & DTP1.Value & ", " & cmbClass.Text & ", " & cmbDiv.Text & ", " & cmbSal.Text & ", " & txtSname.Text & ",'" & gender & "'," & DOBDTP.Value & "," & txtadd.Text & "," & txtFname.Text & "," & txtMobno.Text & "," & txtPrvSchName.Text & "," & ADMDTP.Value & "," & txtAdmFee.Text & "," & cmbStatus.Text & " )"

        qry1 = "Select * from Registration"
        cmd1 = New OleDbCommand(qry1, cn)

        dr1 = cmd1.ExecuteReader()

        If dr1.Read() = True Then

            cmd = New OleDbCommand(qry, cn)
            cmd.ExecuteNonQuery()
            dr1.Close()
            MsgBox("Record Saved Successfully.", MsgBoxStyle.Information, "NES Automation...!!!")
            'ds.Clear()
            qry = "Select * from Registration where fees = '0' and std = " & cmbClass.Text & " )"
            adp = New OleDbDataAdapter(qry, cn)
            adp.Fill(ds, "Registration")
            Grid.DataSource = ds
            Grid.DataMember = ds.Tables(0).ToString
            cn.Close()
        Else
            MsgBox("Record can not Save.", MsgBoxStyle.Critical, "NES Automation...!!!")
        End If
        cn.Close()
    End Sub


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

я много раз пытался проверить, что пошло не так, но так и не нашел решения.

Andre Oosthuizen

по-видимому, проблема заключается в том, где объявлена эта переменная?

2 Ответов

Рейтинг:
2

Patrice T

qry = "INSERT into registration(RegNo,RegDt,Std,Div,SALUTION,SNAME,Gender,DOB,StdAdd,FatName,FatMobNo,PrvSchName,SchEnterDt,Fees,Status )values(" & txtregno.Text & ", " & DTP1.Value & ", " & cmbClass.Text & ", " & cmbDiv.Text & ", " & cmbSal.Text & ", " & txtSname.Text & ",'" & gender & "'," & DOBDTP.Value & "," & txtadd.Text & "," & txtFname.Text & "," & txtMobno.Text & "," & txtPrvSchName.Text & "," & ADMDTP.Value & "," & txtAdmFee.Text & "," & cmbStatus.Text & " )"

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

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


Рейтинг:
1

Richard Deeming

Исправление уязвимостей SQL-инъекций почти наверняка исправит вашу ошибку:

Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
    If txtregno.Text = "" Then
        MsgBox("Please Enter Registration Id", MsgBoxStyle.Critical, "Registration Id is Required...!!!")
        Return
    End If
    
    Const query As String = "INSERT INTO registration (RegNo, RegDt, Std, Div, SALUTION, SNAME, Gender, DOB, StdAdd, FatName, FatMobNo, PrvSchName, SchEnterDt, Fees, Status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
    
    Const query2 As String = "SELECT * FROM Registration WHERE fees = '0' AND std = ?"
    
    Using connection As New OleDbConnection("...")
        connection.Open()
        
        Using command As New OleDbCommand(query, connection)
            command.Parameters.AddWithValue("@RegNo", txtregno.Text)
            command.Parameters.AddWithValue("@RegDt", DTP1.Value)
            command.Parameters.AddWithValue("@Std", cmbClass.Text)
            command.Parameters.AddWithValue("@Div", cmbDiv.Text)
            command.Parameters.AddWithValue("@Salutation", cmbSal.Text)
            command.Parameters.AddWithValue("@SName", txtSname.Text)
            command.Parameters.AddWithValue("@Gender", gender)
            command.Parameters.AddWithValue("@DOB", DOBDTP.Value)
            command.Parameters.AddWithValue("@StdAdd", txtadd.Text)
            command.Parameters.AddWithValue("@FatName", txtFname.Text)
            command.Parameters.AddWithValue("@FatMobNo", txtMobno.Text)
            command.Parameters.AddWithValue("@PrvSchName", txtPrvSchName.Text)
            command.Parameters.AddWithValue("@SchEnterDt", ADMDTP.Value)
            command.Parameters.AddWithValue("@Fees", txtAdmFee.Text)
            command.Parameters.AddWithValue("@Status", cmbStatus.Text)
            
            command.ExecuteNonQuery()
            
            MsgBox("Record Saved Successfully.", MsgBoxStyle.Information, "NES Automation...!!!")
        End Using
        
        Using command As New OleDbommand(query2, connection)
            command.Parameters.AddWithValue("@Std", cmbClass.Text)
            
            Dim da As New DataAdapter(command)
            Dim ds As New DataSet()
            da.Fill(ds, "Registration")
            
            Grid.DataSource = ds
            Grid.DataMember = ds.Tables(0).ToString()
        End Using
    End Using
End Sub


Andre Oosthuizen

ОП использует VB6, приведенный выше код не будет работать. Не знаю, почему люди все еще настаивают на использовании таких старых динозавров. SQL-инъекция все еще была чем-то, о чем кто-то думал в то время и еще не был реализован. :)

Richard Deeming

EventArgs и OleDbCommand не были доступны в VB6. ОП использует VB.NET-да. :)

Andre Oosthuizen

Вы (как всегда) совершенно правы, я прошу прощения за то, что наполовину слепой, должно быть, возраст...