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

无法删除Stock_Jewelry记录求助:表单操作后数据未变更

问题排查与修复方案

我来帮你解决这个删除功能失效的问题,看了你的代码和场景描述后,发现几个核心问题导致删除操作没实际生效:

1. 控件值获取错误(最关键原因)

你在SQL语句里直接写了 txt_ID,这是引用了TextBox控件对象本身,而不是它的文本内容。数据库收到的查询条件会是类似 "System.Windows.Forms.TextBox, Text: 123" 的字符串,根本匹配不到你的自增ID,自然不会删除任何记录。

正确的写法应该是获取控件的Text属性:txt_ID.Text。

2. SQL语句的类型不匹配与注入风险

你的ID是自增整数类型,但你给它加了单引号,把它当成字符串来查询,这会导致数据库类型不匹配,进一步找不到目标记录。同时直接拼接字符串到SQL里存在严重的SQL注入风险,必须改用参数化查询。

3. 数据库连接的不当处理

代码里多次手动调用conn.Close(),没有使用using语句自动管理连接生命周期,容易导致连接泄漏或状态异常,影响后续操作。

4. 网格视图未刷新

删除成功后你关闭了录入表单,但没有通知网格视图重新加载数据,所以界面上还是显示旧数据。


修复后的完整代码

private void bunifuFlatButton3_Click(object sender, EventArgs e) {
    // 先验证输入的ID是否为有效整数
    if (!int.TryParse(txt_ID.Text, out int targetId)) {
        MessageBox.Show("请输入有效的数字ID!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    try {
        // 使用using语句自动释放连接和命令资源,避免泄漏
        using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) {
            conn.Open();
            // 参数化SQL,避免注入+类型匹配
            string deleteQuery = "DELETE FROM Stock_Jewelry WHERE ID = @TargetID;";
            
            using (SqlCommand deleteCmd = new SqlCommand(deleteQuery, conn)) {
                // 明确指定参数类型,匹配自增ID的int类型
                deleteCmd.Parameters.Add("@TargetID", SqlDbType.Int).Value = targetId;
                
                // 执行删除并获取受影响的行数
                int affectedRows = deleteCmd.ExecuteNonQuery();
                
                if (affectedRows > 0) {
                    MessageBox.Show("删除成功!", "成功提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                    // 通知网格视图刷新数据(根据你的窗体结构调整)
                    // 示例:如果网格在父窗体,可调用父窗体的刷新方法
                    // ((YourGridViewForm)this.Owner).ReloadStockData();
                    
                    this.Close();
                } else {
                    MessageBox.Show("未找到要删除的记录!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }
    } catch (Exception ex) {
        MessageBox.Show($"删除失败:{ex.Message}", "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

额外注意事项

  • 把代码里的"你的数据库连接字符串"替换成你实际的连接字符串,建议存放在配置文件(如App.config)中,不要硬编码在代码里。
  • 网格视图刷新:关闭录入表单后,需要在显示网格的窗体中重新执行查询加载最新数据,比如通过调用父窗体的刷新方法,或者用事件通知的方式触发。
  • 输入验证:添加int.TryParse可以避免用户输入非数字ID导致的转换错误,提升程序稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:08