2010-05-06 34 views
8

如何從VB.NET 2008中的數據表中刪除多行而不循環?如何從VB.NET 2008中的數據表中刪除多行?

  • 我不想從數據庫中刪除。
  • 我想從本地數據表中刪除。
  • 我知道Select方法,也知道Remove並在方法中刪除。但是這需要循環刪除數據表中的行。

我有40000行,我想從該數據表中刪除選定的1000行。

+0

你怎麼確定哪個10 4000行的00要刪除? – JeffO 2010-05-06 12:13:37

+0

這是我的問題是,有沒有什麼辦法來確定刪除行? – KuldipMCA 2010-05-10 09:45:15

+0

你可以添加你的問題,你用哪個.NET類來表示內存中的數據?它是DataSet還是其他類?或者我可以重新提出這個問題:你是使用SqlDataAdapter還是LinkToSql或Entity Framework來訪問數據庫?對於每種方式,都可以編寫解決方案,但如果您只需要一個,我不想編寫不同版本的代碼。數據庫表(2-3字段)的一個小例子也可能非常好,那麼我將在我的代碼示例中使用這些字段。 – Oleg 2010-05-10 19:16:31

回答

10

我不知道這可以用直接的方式完成。數據表上沒有刪除命令會執行此操作。

你可以嘗試這樣的事情。您選擇要保留到臨時表中的記錄,清除原始表,然後將臨時表合併回原始表中。

Dim dtTemp As DataTable = ds.Tables("YourTable").Select("RecordsToKeep='This'").CopyToDataTable 
ds.Tables("YourTable").Clear() 
ds.Tables("YourTable").Merge(dtTemp) 
dtTemp.Dispose() 

這是我能想到的問題的最佳答案。您似乎可能以不尋常的方式使用數據表。您通常最好不要將記錄填入開頭,要麼在將內容保存到目標時將其過濾掉。無論是XML文件,SQL還是其他。

當然,循環方法將是最有效的。這可能不是最快的方法,但對於只有4K行,這可能夠好。

+0

我在表中有40000行,在合併之前你說我會清除那張表,然後我失去了所有的行。 – KuldipMCA 2010-05-13 05:06:57

+0

是的,但在清除表之前,您複製了要保留臨時表的記錄。清除之後,您將臨時表(您要保留的39000)的記錄「合併」回原始表(現在爲空)。 最終結果是您已經刪除了1000條記錄而無需編寫循環。 – Bremer 2010-05-13 14:55:56

0

如果您希望刪除所有行,您可以在數據表上使用Clear方法。

+0

我有40000行的表,我想從數據表中刪除1000行。 – KuldipMCA 2010-05-06 07:02:43

+0

@KuldipMCA - 爲什麼你不能使用循環? – Oded 2010-05-06 07:15:30

+0

我有很多記錄來處理只有一個表。 – KuldipMCA 2010-05-06 07:31:27

0
dt.Rows.RemoveAt(0) 
dt.Rows.RemoveAt(1) 
+0

我有40000行的表,我想從數據表中刪除1000行,因爲我不需要使用循環。 – KuldipMCA 2010-05-06 07:03:40

+1

這些是你應該在原始問題中包含的細節。 – tsilb 2010-05-07 06:21:48

0

在某些情況下,我們總是可以編寫存儲過程來優化ADO.NET實體框架或LINQ to SQL往返。缺點是該模型開始看起來有點不一致。 我也懷疑是否有更好的方法:)

0

如果您使用LINQ to SQL,您可以致電DeleteAllOnSubmit()。但是,這將爲每個被刪除的實體提交DELETE語句,這非常低效。您始終可以使用fork LINQ to SQL或使用存儲過程。

順便說一句,你是問題是非常通用的。我的第一個傾向是建議使用WHERE子句。

0

可能會使用DataView會有所詭計。例如,您可以過濾出要保留到DataView中的行,將視圖轉換爲表格並處理初始表格。然後你的桌子上有你需要的行。

Dim view As DataView = YourTable.DefaultView    
view.RowFilter = "YourFilterColumn = 1259" 
Dim tblNew as Datatable = view.ToTable 
YourTable.Dispose 

讓我知道它是否適合你。

0

在ADO.NET命令對象中使用SQL語句。 Obvoiusly你想刪除的行將有一些共同點。

Delete From MyTable where mycolumn='XYZ' and thisColumn='ABC' 
0

我不知道這是否會正式資格作爲使用一個循環,但這裏是使用LINQ的解決方案:

dt.BeginLoadData(); 
(from row in dt.AsEnumerable() 
    where row.Field<string>("MyColumn" ) == "DeleteValue" 
    select row).ToList().ForEach(row => row.Delete()); 
dt.EndLoadData(); 
dt.AcceptChanges(); 

TBH,我不知道是有辦法做到這一點,而無需通過循環某些級別的行。你可以循環刪除那些你不想要的行,或者創建一個新的表格,除了你不想要的行外,其他的都會被填充。但是,應該指出的是,即使在後面的情況下,NET可能循環遍歷行以確定該行是否應該包含在守護程序表中。

0

感謝布雷默,這是刪除行的DataTable中的最佳代碼,對我來說是快速的方法:

Public Sub BorrarFilasEnDatatable(ByRef dtDatos As DataTable, ByVal strWhere As String) 
 
     Dim dtTemp As New DataTable 
 
     Dim filas As DataRow() 
 
     filas = dtDatos.Select("NOT(" & strWhere & ")") 
 
     dtDatos.Clear() 
 
     If filas.Count > 0 Then 
 
      dtTemp = filas.CopyToDataTable 
 
      dtDatos.Merge(dtTemp) 
 
     End If 
 
     dtTemp.Dispose() 
 
End Sub 
 

 
'call me method for delete rows 
 
Me.BorrarFilasEnDatatable(dt1, "Id<10")

相關問題