【问题标题】:How to delete multiple rows from datatable in VB.NET 2008?如何从 VB.NET 2008 中的数据表中删除多行?
【发布时间】:2011-02-16 06:28:36
【问题描述】:

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

  • 我不想从数据库中删除。
  • 我想从本地数据表中删除。
  • 我知道Select 方法,也知道Remove 和删除 at 方法。但这需要循环删除数据表中的行。

我有 40000 行,我想从该数据表中删除选定的 1000 行。

【问题讨论】:

  • 您如何确定要删除 4000 行中的哪 1000 行?
  • 我的问题是,有没有办法确定要删除的行?
  • 您能否在问题中添加您使用哪个 .NET 类来表示内存中的数据?它是 DataSet 还是其他类?或者我可以重新提出这个问题:你是使用 SqlDataAdapter 还是 LinkToSql 还是 Entity Framework 来访问数据库?对于每种方式都可以编写解决方案,但如果您只需要一个,我不想编写不同版本的代码。一个数据库表的小例子(2-3个字段)也可以很好,然后我将在我的代码示例中使用这些字段。
  • 这是我一直在使用的数据集或数据表。
  • 为什么要在不循环的情况下删除它们?是性能问题吗?因为从 4000 行数据表中删除 1000 行只需要几毫秒。

标签: vb.net ado.net


【解决方案1】:

我不知道这是否可以直接完成。数据表上没有删除命令可以执行此操作。

你可以试试这样的。您选择要保留到临时表中的记录,清除原始表,然后将临时表合并回原始表。

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 行,它可能已经足够了。

【讨论】:

  • 我在一个表中有 40000 行,在合并之前你说我将清除该表然后我丢失了所有行。
  • 是的,但是在您清除表之前,您复制了要保留临时表的记录。清除后,您将临时表(您要保留的 39000)中的记录“合并”回原始(现在为空)表。最终结果是你没有写循环就删除了 1000 条记录。
【解决方案2】:

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

【讨论】:

  • 我有 40000 行的表我想从数据表中删除 1000 行。
  • @KuldipMCA - 为什么不能使用循环?
  • @KuldipMCA - 为什么不能遍历表格的行?
【解决方案3】:
dt.Rows.RemoveAt(0)
dt.Rows.RemoveAt(1)

【讨论】:

  • 我有 40000 行的表我想从数据表中删除 1000 行,因为我不需要使用循环。
  • 这些是您应该在原始问题中包含的详细信息。
【解决方案4】:

可能是使用DataView 会出招。例如,您可以过滤掉要保留到 DataView 中的行,将视图转换为表并处理初始表。然后你就有了你需要的行的表。

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

让我知道它是否适合你。

【讨论】:

    【解决方案5】:

    我不确定这是否会被正式认定为使用循环,但这是使用 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 也可能会遍历行以确定该行是否应包含在 keeper 表中。

    【讨论】:

      【解决方案6】:

      我认为您应该为此使用 LINQ。您将从数据集中获取数据表并编写 LINQ 查询以删除符合您的条件的行。

      所以你不需要为此循环。

      以下是一些可能对您有所帮助的链接。

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          如果您使用的是LINQ to SQL,可以致电DeleteAllOnSubmit()。但是,这将为每个被删除的实体提交一个 DELETE 语句,这是非常低效的。你总是可以fork LINQ to SQL,或者使用存储过程。

          顺便说一句,你的问题很笼统。我的第一个倾向是推荐使用 WHERE 子句。

          【讨论】:

            【解决方案9】:

            在某些情况下,我们总是可以编写存储过程来优化 ADO.NET 实体框架或 LINQ 到 SQL 往返。缺点是该模型开始看起来有点不一致。 我也想知道是否有更好的方法:)

            【讨论】:

              【解决方案10】:

              感谢 Bremer,这是删除数据表中行的最佳代码,对我来说是快速方法:

              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")

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-06-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多