You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# WinForm使用存储过程无法删除DataGridView数据:Id传递失败

解决DataGridView触发删除时Id参数传递失败的问题

你的删除功能失效的核心问题是点击删除按钮时,没有从选中的DataGridView行中获取目标记录的Id并赋值给aRegistrationProperty,导致存储过程接收到无效的Id参数;另外还有一个数据库连接未正确打开的潜在问题,我帮你一步步修复:

1. 修复删除按钮事件:获取选中行的Id

首先要在删除操作前,确认用户选中了要删除的行,然后从选中行提取Id并赋值给实体类。根据你的DataGridView绑定方式,有两种实现方案:

方案1:如果绑定的是DataTable

private void deleteButton_Click(object sender, EventArgs e)
{
    // 先判断是否有选中行
    if (dataGridView1.SelectedRows.Count == 0)
    {
        MessageBox.Show("请先选择要删除的记录!");
        return;
    }

    // 从选中行的Id列取值(假设DataGridView中有名为"Id"的列)
    int targetId = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
    
    // 给实体类赋值Id
    aRegistrationProperty.Id = targetId;

    // 执行删除
    int rows = aRegistrationBLL.Delete(aRegistrationProperty);
    if (rows > 0)
    {
        MessageBox.Show("Registration Delete successfully.");
        // 删除后刷新DataGridView,加载最新数据
        LoadRegistrationData(); // 需自行实现该方法,重新查询数据库并绑定到DataGridView
    }
    else
    {
        MessageBox.Show("Registration Delete failed.");
    }
}

方案2:如果绑定的是List<RegistrationProperty>

如果直接绑定实体集合,可以直接从绑定项中获取Id:

private void deleteButton_Click(object sender, EventArgs e)
{
    if (dataGridView1.SelectedRows.Count == 0)
    {
        MessageBox.Show("请先选择要删除的记录!");
        return;
    }

    // 获取选中行对应的实体对象
    RegistrationProperty selectedItem = (RegistrationProperty)dataGridView1.SelectedRows[0].DataBoundItem;
    aRegistrationProperty.Id = selectedItem.Id;

    int rows = aRegistrationBLL.Delete(aRegistrationProperty);
    if (rows > 0)
    {
        MessageBox.Show("Registration Delete successfully.");
        LoadRegistrationData();
    }
    else
    {
        MessageBox.Show("Registration Delete failed.");
    }
}

2. 修复数据访问层的连接问题

你的DLL层ExeNonQuery方法未打开数据库连接,ExecuteNonQuery必须在连接打开的状态下才能执行,同时要确保连接最终关闭:

public int ExeNonQuery(SqlCommand cmd)
{
    cmd.Connection = GetConn();
    int rowsAffected = -1;
    try
    {
        cmd.Connection.Open(); // 必须打开连接
        rowsAffected = cmd.ExecuteNonQuery();
    }
    finally
    {
        // 确保连接关闭,避免资源泄漏
        if (cmd.Connection.State == ConnectionState.Open)
        {
            cmd.Connection.Close();
        }
    }
    return rowsAffected;
}

3. 额外检查项

  • 确认存储过程DeleteUser中的表名RegistrationTable、字段Id与数据库实际情况完全一致;
  • 确保aRegistrationProperty是已实例化的对象(不是null),避免空引用异常;
  • 删除成功后一定要刷新DataGridView,否则界面不会同步更新已删除的记录。

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

火山引擎 最新活动