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
中也有新行?
如果是这样,请使用Update
和Insert
命令,如本例中给出的msdn.microsoft.com/en-us/library/…【参考方案3】:
以编程方式将行添加到表后,调用 AcceptChanges。
【讨论】:
以上是关于SqlDataAdapter 不会从表中删除行的主要内容,如果未能解决你的问题,请参考以下文章