Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datatable中已删除的行未更新到SQL Server_C#_Sql Server - Fatal编程技术网

C# Datatable中已删除的行未更新到SQL Server

C# Datatable中已删除的行未更新到SQL Server,c#,sql-server,C#,Sql Server,我对C#有点陌生,我通常使用VB.net和SQL命令进行编码我的datatable中有一个小问题:当我添加新行或编辑行并保存更改时,一切正常,但当我删除行时,它不会记录在服务器上,该行显示我保存更改的代码,如下所示: using (SqlConnection con = new SqlConnection(ConString)) { CmdString = "SELECT * FROM IncomingPapers"; SqlCommand cmd = new SqlComma

我对C#有点陌生,我通常使用VB.net和SQL命令进行编码我的datatable中有一个小问题:当我添加新行或编辑行并保存更改时,一切正常,但当我删除行时,它不会记录在服务器上,该行显示我保存更改的代码,如下所示:

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不会更新数据库表。它将DataTable中每一行的DataRowState更改为Unchanged,并从内存中丢弃对DataTable所做的每一次更改

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

dt.Rows[PapersLV.SelectedIndex].Delete();
sda.Update(dt);
当然,这意味着您需要在执行删除操作时提供对SqlDataAdapter的引用


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

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

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

dt.Rows[PapersLV.SelectedIndex].Delete();
sda.Update(dt);
当然,这意味着您需要在执行删除操作时提供对SqlDataAdapter的引用


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

您必须调用
da.Update(dt)
before
dt.AcceptChanges()

您必须调用
da.Update(dt)
before
dt.AcceptChanges()

AcceptChanges使您的内存修改无法被更新检测删除行与删除行不同(与VB中相同)@Steve yea我最近做了这件事,但没有它。同样的,删除的行不会被更新查看这个例子的代码@WelcomeOverflow我以前使用SQL命令删除/更新和插入新行,因为我切换到C#我知道你可以使用生成器为你生成SQL命令,而不是自己编写,我应该自己写吗?AcceptChanges使您的内存修改无法被更新检测到移动行与删除行不同(与VB中相同)@Steve yea我最近做了,但没有它。同样的,删除的行不会被更新查看这个例子的代码@WelcomeOverflow我以前使用SQL命令删除/更新和插入新行,因为我切换到C#我知道你可以使用生成器为你生成SQL命令,而不是自己编写,我应该自己写吗?DataTable类中没有更新方法DataTable类中没有更新方法很好的解释这对我有用。现在一切都很好很好的解释这对我来说很有效。现在一切都很好