我在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.
答案 0 :(得分:0)
DataRowCollection.RemoveAt
只删除DataTable
中的行,它不会删除该行(即使您使用DataAdapter
)。因此,您需要使用DataRow.Delete
:
getInfoFilmDS.sp_getInfo.Rows[idx].Delete();
请注意,您现在需要使用DataAdapter
将DataSet
中的更改提交到数据库。
<强>更新强>
我已将语法更改为:
this.getInfoFilmDS.sp_getInfo.Rows[idx].Delete();
sp_getInfoTableAdapter.Adapter.Update(getInfoFilmDS);
但编译器抛出错误:
无效的操作例外。更新需要有效的DeleteCommand 当传递带有已删除行的DataRow集合时。
因此,当您只选择一个表时,您需要定义通常由DeleteCommand
自动生成的DataSet
,也许您只需要重新配置TableAdapter
,它就会自动创建删除命令。否则你必须手动创建它:
答案 1 :(得分: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);
}
它就像一个魅力。