通过 DataAdapter 删除行

3

我已经初始化了一个数据适配器:

string sql = "SELECT * From localitati";
da1 = new System.Data.SqlClient.SqlDataAdapter(sql, con);
da1.Fill(ds1, "localitati");

这个很好用。问题在于当我尝试删除记录并更新数据库时。 我从数据集中删除一条记录,如下:

ds1.Tables["localitati"].Rows.Remove(dRow);

这个也可以正常工作(已验证)。

问题在于当我更新DataAdapter时,数据库没有被修改:

con.Open()
da1.Update(ds1, "localitati");
con.Close();

可能出了什么问题?
5个回答

14

对我有帮助的是,在DataTable中使用DataRowDelete方法而不是Remove方法。

ds.Tables["localitati"].Rows.Find(primaryKeyValue).Delete();
或者简单地说。
dr.Delete();

1
这应该是被接受的答案。.Delete()方法将会通知父DataTable行已被删除。仅仅从表中移除行是不够的。 - oscilatingcretin
在我的代码中,我尝试使用 Table.Clear() 方法,但在 Update 调用之后它并没有更新数据库。然而,使用 Delete 方法却可以。我同意这应该被接受为答案。 - Maxter

1

您需要确保已设置了da1.DeleteCommand - 这是将针对已删除的DataTable中的每一行触发的命令。请参见此MSDN参考以获取示例。


0
在您发布的代码中,只为DataAdapter设置了SelectCommand。 您可以使用以下代码为da1生成Insert、Update和Delete命令。
string sql = "SELECT * From localitati";
da1 = new SqlDataAdapter(sql, con);
SqlCommandBuilder builder = new SqlCommandBuilder(da1);
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
da1.Fill(ds1, "localitati");

然而,CommandBuilder仅适用于相对简单的场景(详情)。对于其余情况,建议编写自己的命令,依赖于自定义命令文本/存储过程。

如果仍然无法正常工作,您可以在服务器上启动SQL Server Profiler以跟踪执行Update方法时传递到数据库的命令。


0
DataRow dr = datatable.Rows.Find(key);      
int Index = datatable.Rows.IndexOf(dr);

BindingContext[DataTable].RemoveAt(Index);     
BindingContext[DataTable].EndCurrentEdit(); 

dataAdapter.Update(DataTable);    
DataTable.AcceptChanges();

2
一些解释可能会很好。 - Petter Friberg

0

尝试以下代码,假设数据库没有抛出任何异常。

con.Open() 
da1.Update(ds1.Tables["localitati"].GetChanges()); 
con.Close(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接