0

我在 C# 中有一个 datagridview 显示查询数据库的结果。我想删除数据,这个方法是使用 DataSet。此方法在某个索引中按下按钮时执行。

编码:

DialogResult _result = MessageBox.Show("Do you want to remove the data?", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (_result == DialogResult.OK) 
{
    int idx = dataGridInfo.CurrentRow.Index;
    this.getInfoFilmDS.sp_getInfo.Rows.RemoveAt(idx);
    MessageBox.Show("Data Removed", "Processing", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

这种方法

this.getInfoFilmDS.sp_getInfo.Rows.RemoveAt(idx);

仅在 DataGridView 中工作,但数据本身并未在数据库中删除。

如何解决这个问题?

提前致谢。

更新我已将语法更改为:

this.getInfoFilmDS.sp_getInfo.Rows[idx].Delete();
sp_getInfoTableAdapter.Adapter.Update(getInfoFilmDS);

但编译器会抛出错误。

Invalid Operation Exception Update requires a valid DeleteCommand when passed DataRow collection with deleted rows.
4

2 回答 2

0

DataRowCollection.RemoveAt只会从 中删除该行DataTable,它不会删除该行(即使您会使用 a DataAdapter)。因此,您需要使用DataRow.Delete

getInfoFilmDS.sp_getInfo.Rows[idx].Delete();

请注意,您现在需要使用 aDataAdapter将 中的更改提交DataSet到数据库。

更新

我已将语法更改为:

this.getInfoFilmDS.sp_getInfo.Rows[idx].Delete();
sp_getInfoTableAdapter.Adapter.Update(getInfoFilmDS);

但编译器会抛出错误:

无效的操作异常。当传递带有已删除行的 DataRow 集合时,更新需要有效的 DeleteCommand。

所以你需要定义当你只选择一个表时DeleteCommand通常自动生成的DataSet,也许你只需要重新配置TableAdapter它,它就会自动创建删除命令。否则,您必须手动创建它:

表适配器概述

于 2013-01-02T10:48:14.937 回答
0

好的,经过研究并向@Tim 寻求支持,它表明 DataSet 没有基于存储过程生成查询(请通知我,如果我错了:D)所以,我需要生成另一个基于 JOIN 表的存储过程..

我的 MySQL 数据库中有三个表,我创建了另一个存储过程来删除数据。然后我将 DELETE 存储过程分配到数据集配置中

然后应用此代码

try
            {
                int idx = dataGridInfo.CurrentRow.Index;
                this.getInfoFilmDS.sp_getInfo.Rows[idx].Delete();
                sp_getInfoTableAdapter.Adapter.Update(getInfoFilmDS);
                MessageBox.Show("Data removed", "Process", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error Delete Data" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

它就像一个魅力。

于 2013-01-02T12:37:06.197 回答