2010-05-06 78 views
8

Cómo eliminar varias filas de datatable en VB.NET 2008 sin bucles?Cómo eliminar varias filas de datatable en VB.NET 2008?

  • No quiero eliminar de la base de datos.
  • Quiero eliminar de la tabla de datos locales.
  • Conozco el método Select y también Remove y elimino en el método también. Pero eso necesita un bucle para eliminar las filas de la tabla de datos.

Tengo 40000 filas y deseo eliminar las 1000 filas seleccionadas de esa tabla de datos.

+0

¿Cómo estás determinando qué 10 00 de las 4000 filas para eliminar? – JeffO

+0

Esa es mi pregunta es, ¿hay alguna manera de determinar las filas para la eliminación? – KuldipMCA

+0

¿Podría agregar a su pregunta qué clase .NET utiliza para representar los datos en la memoria? ¿Es DataSet u otra clase? O puedo reformular la pregunta: ¿usa SqlDataAdapter o LinkToSql o Entity Framework para acceder a la base de datos? Por cada forma en que uno puede escribir una solución, pero no quiero escribir diferentes versiones del código si solo necesita una. Un pequeño ejemplo de tabla de base de datos (2-3 campos) también podría ser muy bueno, entonces usaré estos campos en mi ejemplo de código. – Oleg

Respuesta

10

No sé si esto se puede hacer de una manera directa. No hay ningún comando de eliminación en la tabla de datos que hará esto.

Puede intentar algo como esto. Seleccione los registros que desea mantener en una tabla temporal, borre la tabla original y luego combine la tabla temporal de nuevo en la original.

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

Esa es la mejor respuesta a la pregunta que se me ocurre. Parece que puede estar usando la tabla de datos de una manera inusual. Por lo general, es mejor que no llene los registros para empezar o que los filtre cuando guarde los contenidos en su destino. Ya sea un archivo XML, SQL o lo que sea.

Sin duda, el método de bucle sería el más eficiente. Es probable que este no sea el método más rápido, pero por solo 4K filas, probablemente sea lo suficientemente bueno.

+0

Tengo 40000 filas en una tabla y antes de la fusión dijiste que borraría esa tabla y luego perdí todas mis filas. – KuldipMCA

+0

Sí, pero antes de borrar la tabla, copió los registros que desea para mantener una tabla temporal. Después de borrar, "fusiona" los registros de la tabla temporal (el 39000 que desea conservar), de vuelta a la tabla original (ahora vacía). El resultado final es que ha borrado los 1000 registros sin escribir un bucle. – Bremer

0

Si desea eliminar todas las filas, puede utilizar el método Clear en la tabla de datos.

+0

Tengo una tabla con 40000 filas. Quiero eliminar 1000 filas de la tabla de datos. – KuldipMCA

+0

@KuldipMCA - ¿Por qué no puedes usar looping? – Oded

+0

tengo muchos registros para procesar esa única tabla. – KuldipMCA

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

tengo una tabla con 40000 filas. Quiero eliminar 1000 filas de la tabla de datos para las que no necesito usar el ciclo. – KuldipMCA

+1

Estos son detalles que debe incluir en la pregunta original. – tsilb

0

Siempre podemos escribir un procedimiento almacenado para optimizar ADO.NET entity-framework o LINQ to SQL roundtrips en algunos casos. El inconveniente es que ese modelo comienza a parecer un poco inconsistente. yo también se preguntan si hay una mejor manera :)

0

Puede llamar DeleteAllOnSubmit() si está usando LINQ to SQL. Sin embargo, esto enviará una declaración DELETE para cada entidad que se elimine, lo que es altamente ineficiente. Siempre puede fork LINQ to SQL, o usar un procedimiento almacenado.

Por cierto, su pregunta es muy genérica. Mi primera inclinación fue recomendar el uso de una cláusula WHERE.

0

Puede ser que usar DataView sería un truco. Por ejemplo, puede filtrar las filas que desea conservar en DataView, convertir la vista en tabla y disponer de la tabla inicial. Luego tienes tu mesa con las filas que necesitabas.

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

Avísame si te funciona.

0

Utilice una instrucción SQL dentro de un objeto de comando ADO.NET. Obviamente, las filas que desea eliminar tendrán algo en común.

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

No estoy seguro de si esto va a calificar oficialmente como el uso de un bucle, pero aquí es una solución utilizando 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, no estoy seguro de que hay una manera de hacer esto sin un bucle a través las filas en algún nivel. O recorre las filas borrando las que no desea, o crea una nueva tabla con todo excepto las filas que no desea. Sin embargo, debe tenerse en cuenta que, incluso en el caso posterior, NET probablemente esté recorriendo las filas para determinar si la fila debe incluirse en la tabla del guardián.

0

Gracias Bremer, este es el código óptimo para Eliminar filas en una tabla de datos, para mí es el método rápido:

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