如何在VB.NET 2008中从数据表中删除多行?

8

如何在不使用循环的情况下从VB.NET 2008数据表中删除多行?

  • 我不想从数据库中删除。
  • 我想从本地数据表中删除。
  • 我知道Select方法以及Remove和remove at方法。但是这需要循环来从数据表中删除行。

我有40000行数据,我想从其中选择1000行进行删除。


你是如何确定要删除4000行中的哪1000行的? - JeffO
这是我的问题,有没有办法确定要删除的行? - KuldipMCA
你能否在问题中添加一下你使用哪个.NET类来表示内存中的数据?是DataSet还是其他类?或者我可以重新表述问题:你使用SqlDataAdapter、LinkToSql还是Entity Framework来访问数据库?每种方式都有不同的解决方案,但如果你只需要一个,我就不想写不同版本的代码。如果能提供一个小的数据库表示例(2-3个字段),那就更好了,这样我就可以在我的代码示例中使用这些字段。 - Oleg
这是我一直在使用的数据集或数据表。 - KuldipMCA
你为什么想要在不循环的情况下删除它们?这是性能问题吗?因为从一个包含4000行数据表中删除1000行只需要几毫秒的时间。 - Tim Schmelter
@KuldipMCA:您的声望已按要求重新计算。 - Bill the Lizard
10个回答

12

我不知道这是否可以直接完成。datatable上没有一个删除命令可以做到这一点。

你可以尝试类似于这样的方法。将你想要保留的记录选择到一个临时表中,清空原始表,然后将临时表合并回原始表中。

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

这是我能想到的对这个问题最好的回答。看起来你可能正在以一种不寻常的方式使用datatable。通常最好的做法是不要一开始就填充记录,或者在保存内容到其目标(XML文件、SQL等)时过滤它们。

当然,循环方法可能是最有效的。虽然这可能不是最快的方法,但对于仅有4K行的情况,它可能已经足够了。


我有一张表格里面有40000行数据,在合并之前你说要清空这个表格,结果我失去了所有的数据。 - KuldipMCA
是的,在清空表格之前,您将要保留的记录复制到了一个临时表中。在清空后,您将从临时表(即您想要保留的39000条记录)中“合并”这些记录回原始(现在为空的)表格中。最终结果是,您已经删除了1000条记录,而无需编写循环。 - Bremer

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

我有一个有40000行的表,我想从数据表中删除1000行,为此我不需要使用循环。 - KuldipMCA
1
这些是你应该在原始问题中包含的细节。 - tsilb

0

在 ADO.NET 命令对象中使用 SQL 语句。显然,您想要删除的行将具有共同点。

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

说实话,我不确定是否有一种方法可以在某个级别上避免循环遍历行来完成此操作。要么您循环遍历行并删除您不想要的行,要么创建一个新表,其中包含除您不想要的行之外的所有内容。但是,值得注意的是,即使在后一种情况下,NET 也可能会循环遍历行以确定该行是否应包含在保留表中。

0
如果您想要删除所有行,可以在数据表上使用Clear方法。

我有一个包含40000行的表格,我想从数据表中删除1000行。 - KuldipMCA
@KuldipMCA - 为什么你不能使用循环? - Oded
3
为什么你不能循环遍历表格的行? - Oded

0
我们总是可以编写存储过程来优化ADO.NET实体框架或LINQ到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

我认为你应该使用LINQ。你可以从数据集中获取datatable,并编写一个LINQ查询来删除符合条件的行。

所以你不需要循环。

这里有一些链接可能会对你有帮助。


0

谢谢Bremer,这是最优的代码用于在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")


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