You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB.NET中使用SQL删除DataGridView选中的数据行?

问题分析与解决思路

你的代码存在几个核心问题,导致数据无法被删除:

  • SQL语句完全错误:你写的"Delete * from dgrdUsers.SelectedRows(0).Cells"不符合SQL语法,SQL无法识别WinForms控件的代码,必须明确指定要操作的数据库表名,并用条件定位目标行。
  • 未执行实际删除操作:仅初始化SqlDataAdapter但未调用执行方法,且你的用法完全不符合数据适配器的逻辑。
  • 资源未正确释放:数据库连接未用Using包裹,可能导致连接泄漏。
  • 空异常捕获:原代码的空Catch会隐藏错误,无法排查问题。

修正后的代码示例

直接用SqlCommand执行删除(简单高效)

Private Sub DeleteSelectedUsers(username As String)
    ' Using语句自动释放连接、命令等资源
    Using connection As New SqlConnection("Data Source=GERARD-PC\SQLEXPRESS; Initial Catalog=TestDB;User ID=AccountsUser;Password=password123")
        connection.Open()
        ' 参数化SQL,避免注入风险,语法符合规范
        Dim deleteCmd As New SqlCommand("DELETE FROM [你的表名] WHERE Username = @Username", connection)
        ' 绑定参数,指定类型和值
        deleteCmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = username
        ' 执行删除,返回受影响行数
        Dim affectedRows As Integer = deleteCmd.ExecuteNonQuery()
        
        If affectedRows > 0 Then
            MessageBox.Show("删除成功")
            ' 刷新DataGridView,让界面同步数据库状态
            RefreshDataGridView()
        Else
            MessageBox.Show("未找到对应用户")
        End If
    End Using
End Sub

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
    Try
        ' 先判断是否选中行,避免空引用异常
        If dgrdUsers.SelectedRows.Count = 0 Then
            MessageBox.Show("请先选中要删除的用户")
            Return
        End If
        
        Dim username As String = dgrdUsers.SelectedRows(0).Cells("Username").Value.ToString()
        If MessageBox.Show(Me, "确认删除用户 " & username & "?", "删除确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
            DeleteSelectedUsers(username)
        End If
    Catch ex As Exception
        ' 捕获并显示错误,方便调试
        MessageBox.Show("删除出错:" & ex.Message)
    End Try
End Sub

' 补充:刷新DataGridView的方法,需自行实现数据重新绑定
Private Sub RefreshDataGridView()
    ' 示例:重新查询数据库并绑定到DataGridView
    ' Using connection As New SqlConnection(你的连接字符串)
    '     Dim adapter As New SqlDataAdapter("SELECT * FROM [你的表名]", connection)
    '     Dim dt As New DataTable()
    '     adapter.Fill(dt)
    '     dgrdUsers.DataSource = dt
    ' End Using
End Sub

关键修正说明

  • 参数化查询:用@Username代替字符串拼接,避免SQL注入,同时解决特殊字符导致的语法错误。
  • 资源自动释放:Using语句确保数据库连接、命令对象使用后自动释放,避免资源泄漏。
  • 直接执行删除:用SqlCommand.ExecuteNonQuery()直接执行删除操作,比SqlDataAdapter更适合单条数据删除场景。
  • 增加边界判断:添加选中行判断,避免空引用异常;捕获异常并提示,方便排查问题。

内容的提问来源于stack exchange,提问作者Dylaka83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:01:18