【问题标题】:Deleted Row in Datatable is not updated to SQL Server数据表中已删除的行未更新到 SQL Server
【发布时间】:2019-01-11 20:30:12
【问题描述】:

我对 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();

该行已从数据表中删除,但保存时更改不会保存到服务器,所有删除的行都恢复正常

【问题讨论】:

  • AcceptChanges 使您的内存中修改无法被更新检测到
  • 删除行与删除行不同(与VB相同)
  • @Steve 是的,我最近这样做了,但没有它。相同的东西仍然被删除的行没有得到更新
  • @WelcomeOverflow 我曾经使用 SQL 命令来删除/更新和插入新行,并且由于我切换到 C# 我读过您可以使用构建器为您制作 Sql 命令,而不是自己编写它们,我应该自己写吗?

标签: c# sql-server


【解决方案1】:

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

如果要使用 SqlDataAdapter 更新行,则不应使用 RemoveAt 和 AcceptChanges,而是调用行上的 Delete 和适配器更新方法

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

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

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

【讨论】:

  • 很好的解释
  • 这对我有用。现在一切正常
【解决方案2】:

你必须在dt.AcceptChanges();之前调用da.Update(dt);

【讨论】:

  • DataTable类中没有Update方法
猜你喜欢
  • 2018-09-11
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多