Это код, который я использую. Появится окно сообщения, но когда я выбираю "да", выбранная строка не удаляется в 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
Посмотрите на эту строку:
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
using
должны быть одного Type
.
using
блоков без увеличения отступа и только один набор скобок. К сожалению, Visual Studio для VB агрессивно относится к отступам, и нельзя избежать нескольких строк End Using
WHERE
, и вы объединяете целое число непосредственно в конце слова «оборудование». Рекомендую параметризовать этот запрос, так как это поможет предотвратить внедрение SQL и также поможет решить эту проблему.