2010-05-06 19 views
8

Comment supprimer plusieurs lignes de datatable dans VB.NET 2008 sans boucler?Comment supprimer plusieurs lignes de datatable dans VB.NET 2008?

  • Je ne souhaite pas supprimer de la base de données.
  • Je souhaite supprimer de la table de données locale.
  • Je connais la méthode Select et également Remove et retirer à la méthode aussi. Mais cela nécessite une boucle pour supprimer les lignes de la table de données.

J'ai 40000 lignes et je veux supprimer 1000 lignes sélectionnées de cette table de données.

+0

Comment déterminez-vous qui 10 00 des 4000 lignes à supprimer? – JeffO

+0

Voilà ma question est, est-il un moyen de déterminer les lignes pour la suppression? – KuldipMCA

+0

Pourriez-vous ajouter à votre question quelle classe .NET vous utilisez pour représenter les données en mémoire? Est-ce DataSet ou une autre classe? Ou je peux reformuler la question: utilisez-vous SqlDataAdapter ou LinkToSql Ou Entity Framework pour accéder à la base de données? Pour chaque façon, on peut écrire une solution, mais je ne veux pas écrire des versions différentes du code si vous n'en avez besoin que d'une seule. Un petit exemple de table de base de données (2-3 champs) pourrait aussi être très bon, alors je vais utiliser ces champs dans mon exemple de code. – Oleg

Répondre

10

Je ne sais pas que cela peut être fait d'une manière directe. Il n'y a pas de commande delete sur le datatable qui va le faire.

Vous pourriez essayer quelque chose comme ça. Vous sélectionnez les enregistrements que vous souhaitez conserver dans une table temporaire, effacez la table d'origine, puis fusionnez la table temporaire dans l'original.

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

C'est la meilleure réponse à la question que je peux penser. Il semble que vous utilisiez le datatable d'une manière inhabituelle. Il est généralement préférable de ne pas remplir les enregistrements ou de les filtrer lorsque vous enregistrez le contenu à sa destination. Qu'il s'agisse d'un fichier XML, SQL ou autre.

Certainement, la méthode de la boucle serait la plus efficace. Ce n'est pas la méthode la plus rapide, mais pour seulement 4K lignes, c'est probablement assez bon.

+0

J'ai 40000 lignes dans une table et avant de fusionner vous avez dit que je vais effacer cette table puis j'ai perdu toutes mes lignes. – KuldipMCA

+0

Oui, mais avant d'effacer la table, vous avez copié les enregistrements que vous souhaitez conserver dans une table temporaire. Après le clear, vous "fusionnez" les enregistrements de la table temporaire (les 39000 que vous voulez conserver), de nouveau dans la table originale (maintenant vide). Le résultat final est que vous avez supprimé les 1000 enregistrements sans écrire une boucle. – Bremer

0

Si vous souhaitez supprimer toutes les lignes, vous pouvez utiliser la méthode Clear sur la datatable.

+0

J'ai table avec 40000 lignes je veux enlever 1000 lignes de datatable. – KuldipMCA

+0

@KuldipMCA - Pourquoi ne pas utiliser la boucle? – Oded

+0

J'ai beaucoup d'enregistrements pour traiter cette seule table. – KuldipMCA

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

J'ai table avec 40000 lignes je veux enlever 1000 lignes de datatable pour que je n'ai pas besoin d'utiliser la boucle. – KuldipMCA

+1

Ce sont les détails que vous devez inclure dans la question originale. – tsilb

0

Nous pouvons toujours écrire une procédure stockée pour optimiser la structure d'entité ADO.NET ou les allers-retours LINQ vers SQL dans certains cas. L'inconvénient est que ce modèle commence à sembler un peu inconsistant. Je me demande aussi s'il y a un meilleur moyen :)

0

Vous pouvez appeler DeleteAllOnSubmit() si vous utilisez LINQ to SQL. Cependant, ceci soumettra une instruction DELETE pour chaque entité en cours de suppression, ce qui est très inefficace. Vous pouvez toujours fork LINQ to SQL ou utiliser une procédure stockée.

BTW, vous êtes question est très générique. Mon premier penchant était de recommander l'utilisation d'une clause WHERE.

0

Peut être utiliser DataView ferait un tour. Par exemple, vous pouvez filtrer les lignes que vous souhaitez conserver dans DataView, convertir la vue en table et disposer la table initiale. Ensuite, vous avez votre table avec les lignes dont vous aviez besoin.

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

Faites-moi savoir si cela fonctionne pour vous.

0

Utilisez une instruction SQL dans un objet de commande ADO.NET. Évidemment, les lignes que vous voulez supprimer auront quelque chose en commun.

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

Je ne sais pas si cela sera officiellement admissible en utilisant une boucle, mais voici une solution 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, je ne suis pas sûr qu'il ya un moyen de le faire sans bouclage les lignes à un certain niveau. Soit vous parcourez les lignes en supprimant celles que vous ne voulez pas, soit vous créez une nouvelle table remplie de tout sauf les lignes que vous ne voulez pas. Cependant, il convient de noter que même dans le cas ultérieur, NET parcourt probablement les lignes pour déterminer si la ligne doit être incluse dans la table de gardien.

0

Merci Bremer, c'est le code optimal pour les lignes de suppression dans un datatable, pour moi est la méthode rapide:

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

Questions connexes