2011-04-19 59 views
3

我想從rowatate屬性值刪除的數據表中刪除所有行。如何從數據表中刪除所有行

DataTable dt; 
dt.Clear(); // this will not set rowstate property to delete. 

目前我遍歷所有行並刪除每一行。

有什麼有效的方法嗎? 我不想在SQL Server中刪除我想使用DataTable方法。


+0

您需要提供更多的細節;你使用什麼數據庫,什麼語言? – CharlesB 2011-04-19 12:05:04

+0

我正在使用C#和SQL Server數據庫。 – meetjaydeep 2011-04-19 12:31:37

回答

4

,我們正在使用這種方式:

for(int i = table.Rows.Count - 1; i >= 0; i--) { 
    DataRow row = table.Rows[i]; 
    if (row.RowState == DataRowState.Deleted) { table.Rows.RemoveAt(i); } 
} 
+2

我認爲這是唯一更好的方法 foreach(DataRow row in dt.Rows) { row.Delete(); } – meetjaydeep 2011-04-19 12:30:43

+3

@meetjaydeep:如果你做foreach,你不能改變集合。但RemeoveAt()更改集合,所以foreach將拋出異常。所以這不是解決方案。 – TcKs 2011-04-19 15:29:26

0

由於您使用的是SQL Server數據庫,我會主張簡單地執行SQ​​L命令"DELETE FROM " + dt.TableName

+0

我想從DataTable中刪除,它應該更新行狀態。 – meetjaydeep 2011-04-19 14:45:59

+0

使用動態sql做它是一個壞主意。 http://www.sommarskog.se/dynamic_sql.html#good_practices – ykatchou 2011-04-21 17:59:51

0

我會放下桌子,以最快的方式刪除一切。然後重新創建表格。

0

您可以在SQL Server數據庫上創建一個存儲過程,刪除表中的所有行,從您的C#代碼執行它,然後重新查詢數據表。

0

我tipically執行下面的SQL命令:

DELETE FROM TABLE WHERE ID>0 
3

這將滿足任何FK級聯的關係,如 '刪除'(即DataTable.Clear()不會):

DataTable dt = ...; 
// Remove all 
while(dt.Count > 0) 
{ 
    dt.Rows[0].Delete(); 
} 
+0

我可能過早地+1了。這並不總是奏效。這容易受到無限循環的影響。看起來像.Delete()並不總是擺脫一行。它似乎只是在某些情況下將某行的RowState標記爲已刪除,而沒有實際刪除它們。這似乎與該行是直接創建還是通過數據庫調用添加相關。 – Yetti 2012-03-26 16:31:39

0

這裏是我在尋找這個問題後,在自己的代碼中解決的解決方案,從Jorge的答案中獲得靈感。

DataTable RemoveRowsTable = ...; 
int i=0; 
//Remove All 
while (i < RemoveRowsTable.Rows.Count) 
{ 
    DataRow currentRow = RemoveRowsTable.Rows[i]; 
    if (currentRow.RowState != DataRowState.Deleted) 
    { 
     currentRow.Delete(); 
    } 
    else 
    { 
     i++; 
    } 
} 

這樣,您可以確保將所有行都刪除或將其DataRowState設置爲已刪除。

此外,由於在枚舉時修改集合,您將不會收到InvalidOperationException,因爲不使用foreach。但是,Jorge的解決方案容易受到的無限循環錯誤在這裏不是問題,因爲代碼將增加到DataRow已經被設置爲已刪除的DataRow。

2
dt.Rows.Clear(); 
dt.Columns.Clear(); //warning: All Columns delete 
dt.Dispose(); 
相關問題