VB.Net Удалить выбранную строку в DataGridView MySql

0

Это код, который я использую. Появится окно сообщения, но когда я выбираю "да", выбранная строка не удаляется в datagridview и базе данных.

Private Sub Delete2_Click_1(sender As Object, e As EventArgs) Handles Delete2.Click
        MySqlConn = New MySqlConnection
        MySqlConn.ConnectionString = "server=127.0.0.1;userid=root;password=;database=equipment"

        Try
            If Me.DataGridView2.Rows.Count > 0 Then
                If Me.DataGridView2.SelectedRows.Count > 0 Then
                    Dim intStdID As Char = Me.DataGridView2.SelectedRows(0).Cells("asset_code").Value
                    'open connection
                    If Not MySqlConn.State = ConnectionState.Open Then
                        MySqlConn.Open()
                    End If

                    'delete data
                    Dim cmd As New MySqlCommand
                    cmd.Connection = MySqlConn
                    cmd.CommandText = "DELETE * FROM equipment.equipment" & intStdID
                    Dim res As DialogResult
                    res = MsgBox("Are you sure you want to DELETE the selected Row?", MessageBoxButtons.YesNo)
                    If res = Windows.Forms.DialogResult.Yes Then
                        cmd.ExecuteNonQuery()

                    Else : Exit Sub
                    End If
                    'refresh data
                    Load_table()

                    'close connection
                    MySqlConn.Close()
                End If
            End If
        Catch ex As MySqlException
        End Try
  • 1
    В вашем запросе SQL нет WHERE , и вы объединяете целое число непосредственно в конце слова «оборудование». Рекомендую параметризовать этот запрос, так как это поможет предотвратить внедрение SQL и также поможет решить эту проблему.
  • 2
    Не глотайте подобные исключения, вы увидите полезное сообщение, если вы вошли в систему или обработали исключение иным образом.
Теги:
phpmyadmin

1 ответ

0

Посмотрите на эту строку:

 cmd.CommandText = "DELETE * FROM equipment.equipment" & intStdID

Он пытается добавить значение ID из выбранной ячейки в оператор SQL. Однако похоже, что это только значение идентификатора. Вам также понадобится WHERE ID= для запроса.

Более того, он использует это значение ID в запросе неверно. НИКОГДА не стоит использовать конкатенацию строк для включения данных в запрос. Вы должны использовать параметризованные запросы.

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

Private Sub Delete2_Click_1(sender As Object, e As EventArgs) Handles Delete2.Click
    If Me.DataGridView2.Rows.Count = 0 OrElse Me.DataGridView2.SelectedRows.Count = 0 Then
        Exit Sub
    End If

    Dim res As DialogResult = MsgBox("Are you sure you want to DELETE the selected Row?", MessageBoxButtons.YesNo)
    If res <> DialogResult.Yes Then Exit Sub

    Dim intStdID As Char = Me.DataGridView2.SelectedRows(0).Cells("asset_code").Value
    Dim SQL as String = "DELETE * FROM equipment.equipment WHERE equipment.StdID= @AssetCode"

    Using con As New MySqlConnection("server=127.0.0.1;userid=root;password=;database=equipment"), _
          cmd As New MySqlCommand(SQL, con)

        cmd.Parameters.Add("@AssetCode", MySqlDbType.VarChar, 1).Value = intStdID            
        con.Open()
        cmd.ExecuteNonQuery()
    End Using
    Load_table()
End Sub
  • 0
    Это работает в VB? Я думал, что несколько переменных в блоке using должны быть одного Type .
  • 0
    @Crowcoder Это работает, хотя и немного обманывает (в редких случаях возможно, что 2-й объект не удаляется сразу). Но за более чем десятилетие это никогда не вызывало проблем для любого кода, на который мне выпала привилегия. Теперь, если бы вторым объектом было соединение, а не просто команда, я мог бы быть более осторожным с этим. C # позволяет обойти проблему путем укладки мультипликатор с using блоков без увеличения отступа и только один набор скобок. К сожалению, Visual Studio для VB агрессивно относится к отступам, и нельзя избежать нескольких строк End Using
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню