2010-11-29 111 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();