SqlDataAdapter 不会从表中删除行

Posted

技术标签:

【中文标题】SqlDataAdapter 不会从表中删除行【英文标题】:SqlDataAdapter does not delete the rows from the table 【发布时间】:2015-04-10 05:09:43 【问题描述】:

我在 C# DataTable 中有一组 Id。同时,我还有一个包含这些 ID 和其他一些数据的表。我的要求是删除包含数据表中指定的 ID 的记录(如果有具有该 ID 的元组)。

我正在为此使用 SqlDataAdapter。

SqlCommand command = new SqlCommand(text, con);


command.UpdatedRowSource = UpdateRowSource.None;
PrepareCommand(command, con, null, type, text, commandParas);

SqlDataAdapter adpt = new SqlDataAdapter();
adpt.DeleteCommand = command;

adpt.UpdateBatchSize = 2;

adpt.Update(dataTable);

connection.Close();

我的意思是,

- "text" is the name of the stored procedure containing the delete command. The argument given to this stored procedure is the ID ( picked from the list of IDs contained in the data table) 

- "commandParas" is the argument passed to the stored procedure.

- "dataTable" contains the Ids used to delete the rows from  SQL table. It contains only one column but several rows.

但这不会导致删除表中的指定行。

编辑

我已经给出了下面的存储过程

CREATE PROCEDURE someName(@ID INT)
AS
BEGIN
     DELETE FROM SampleTable
     WHERE id=@ID
END

我下面给出的是我创建数据表的代码

   DataTable dt=new DataTable("abc");
   dt.clear();
   dt.Columns.Add(empId,typeof(int));

   foreach(SomeClass t SomeList)
         dt.Rows.Add(t.IdNo);

我有错吗?

【问题讨论】:

使用SqlAdapter删除记录有什么具体要求吗?您可以为此使用 SqlCommand。 访问this 了解如何创建最小、完整且可验证的示例。您没有提供 SQL 存储过程 PrepareCommand 以及如何将 id 传递给存储过程等等。 @Selva TS :任何可以帮助我删除行的东西都可以。但我必须传递一组 Id,而不是一个 Id。这是必须的。你有什么解决办法吗? @JenishRabadiya:对不起......我也会提供存储过程。如果您对此有解决方案,请告诉我 @nidarshanifernando 你的数据库是什么? Sql Server 2008 或更高版本?如果是这样,我们可以在这种情况下使用TableValueParameter 【参考方案1】:

我看到你打电话给PrepareCommand,并将它设置为适配器的DeleteCmmand,但是你在哪里运行命令?

【讨论】:

好的,你能不能把设置删除行的代码也加进去。 我也刚刚添加了那部分 很好,但是您仍然需要对要删除的数据表中的行调用 delete。请参阅此处:msdn.microsoft.com/en-us/library/feh3ed13.aspx 以获得一些指导。所以现在你在数据表中有行,但是在你将它们标记为删除之前,删除命令不会被调用,因为没有什么要删除的。【参考方案2】:

正如DWright 所指出的,您必须先在DataTable 中设置要删除的行,然后再将其推入SqlDataAdapter 批处理操作。当我将行设置为已删除时,以下代码有效。

        DataTable dt;

        using (SqlConnection c = new SqlConnection(connectionString))
        
            using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM [dbo].[Dealer]", c))
            
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                dt = ds.Tables[0];
            
        

        dt.Rows[0].Delete();
        dt.Rows[1].Delete();
        dt.Rows[2].Delete();

        using (SqlConnection c = new SqlConnection(connectionString))
        
            var adapter = new SqlDataAdapter();
            var command = new SqlCommand("DELETE FROM Dealer WHERE DealerId = @DealerId;", c);

            var parameter = command.Parameters.Add("@DealerId", SqlDbType.Int, 3, "DealerId");
            parameter.SourceVersion = DataRowVersion.Original;

            adapter.DeleteCommand = command;
            adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;

            adapter.UpdateBatchSize = 2;
            adapter.Update(dt);
        

【讨论】:

感谢您的解决方案。在将行传递给 Update() 方法之前,我设置了要删除的行。它会生成以下异常“system.InvalidOperationException:当传递带有新行的 DataRow 集合时,更新需要有效的 InsertCommand。” @nidarshanifernando 所以你在DataTable中也有新行? 如果是这样,请使用UpdateInsert 命令,如本例中给出的msdn.microsoft.com/en-us/library/…【参考方案3】:

以编程方式将行添加到表后,调用 AcceptChanges。

【讨论】:

以上是关于SqlDataAdapter 不会从表中删除行的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqldataadapter.fill 刷新数据 - 看不到新数据

在笔记本上使用 pyspark 从表中删除行

从表中删除重复行

根据先前的值从表中删除行

MySQL 从表中删除所有行并将 ID 重置为零

MySQL 从表中删除所有行并将 ID 重置为零