如何在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
相关产品推荐
相关产品推荐

