数据表中的已删除行未更新为SQL Server

时间:2019-01-11 20:30:13

标签: c# sql-server

我是C#的新手,通常使用VB.net和SQL命令进行编码我的数据表中存在一个小问题:当我添加新行或编辑行并保存更改时,一切正常,但是当我删除一行时,它并没有记录在服务器上,并且该行说我的代码用于保存更改,如下所示:

using (SqlConnection con = new SqlConnection(ConString))
{
    CmdString = "SELECT * FROM IncomingPapers";

    SqlCommand cmd = new SqlCommand(CmdString, con);
    SqlDataAdapter sda = new SqlDataAdapter(cmd);

    SqlCommandBuilder builder = new SqlCommandBuilder(sda);
    sda.UpdateCommand = builder.GetUpdateCommand();
    sda.DeleteCommand = builder.GetDeleteCommand();
    sda.InsertCommand = builder.GetInsertCommand();

    sda.Update(dt);
}

,用于从数据表中删除行的代码为:

dt.Rows.RemoveAt(PapersLV.SelectedIndex);
dt.AcceptChanges();

该行已从数据表中删除,但在保存更改时未保存到服务器,并且所有已删除的行均恢复正常

2 个答案:

答案 0 :(得分:2)

DataTable.AcceptChanges不会更新数据库表。它将DataTable中每一行的DataRowState更改为Unchanged,并从内存中丢弃您对DataTable所做的每次更改

如果要使用SqlDataAdapter更新行,则不应使用RemoveAt和AcceptChanges,而应调用“删除行”和适配器更新方法

dt.Rows[PapersLV.SelectedIndex].Delete();
sda.Update(dt);

这当然意味着您需要在Delete操作时引用可用的SqlDataAdapter

您当前的代码使用RemoveAt,但这会从DataTable中删除该行(内存对象中),并且不会为Adapter留下任何信息以在数据库中查找记录。相反,Delete方法不会删除行,而是将DataRowState更改为Deleted。现在,适配器使用已删除行中的主键值在数据库中查找要删除的记录。

答案 1 :(得分:0)

您必须在da.Update(dt);之前致电dt.AcceptChanges();