2010-11-29 78 views
2

我初始化一个DataAdapter:删除行通过DataAdapter的

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

可能是什么问题呢?

回答

2

您需要确保已设置da1.DeleteCommand - 这是将为DataTable中已删除的每一行触发的命令。例如,请参阅this MSDN reference

0

尝试下面的代码 假设数据库没有引发任何异常。

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

在您发布的代码中,只有为DataAdapter设置的SelectCommand。 您可以使用以下代码为da1生成插入,更新和删除命令。

string sql = "SELECT * From localitati"; 
da1 = new SqlDataAdapter(sql, con); 
SqlCommandBuilder builder = new SqlCommandBuilder(da1); 
builder.QuotePrefix = "["; 
builder.QuoteSuffix = "]"; 
da1.Fill(ds1, "localitati"); 

然而CommandBuilder只能用于相对简单的场景(details)。建议他休息一下,编写依靠自定义命令文本/存储过程的自己的命令。

如果它仍然不起作用,您可以启动服务器上的SQL Server事件探查器以跟踪执行Update方法时获取到数据库的命令。

9

对我来说固定的是在DataRow上调用Delete方法,而不是DataTable上的Remove方法。

ds.Tables["localitati"].Rows.Find(primaryKeyValue).Delete(); 

或者只是

dr.Delete(); 
+0

这应该是公认的答案。 .Delete()方法将提醒父DataTable该行已被删除。仅仅从表格中删除行是不够的。 – oscilatingcretin 2016-05-25 13:48:22

+0

是的,ans是如此之好。 – 2016-06-03 14:50:24

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