IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Petit soucis de delete sur un DataTable


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut Petit soucis de delete sur un DataTable
    Bonjour à tous,

    Je commence à "m'emmeller les pinceaux" entre ces datatable,dataset,datareader,dataApater :-)

    Voici mon soucis.

    Je lis une base de donnée, stock le résultat dans un DataTable.
    Je traite ce DataTable ( export vers fichiers TXT).

    Je souhaiterai parcourir ce DataTable et supprimer certaines lignes suivant un test.

    Je pense arriver à supprimer ma ligne, mais il doit y avoir un soucis de mise à jour entre mes rows et mon DataTable.

    Je précise bien que je ne veux PAS mettre à jour ma base de donnée.

    Je veux juste supprimer des lignes de mon DataTable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     DataTable TableArt = new DataTable();                           
     TableArt.Load(MaBase.GetDataReader());                        
     
     // On supprime les colonnes qui ont des stocks purement à zéros.
     
    foreach (DataRow _row in TableArt.Rows)
    {
           if (Double.Parse(_row.ItemArray.GetValue(2).ToString()) == 0)
           {
                 _row.Delete();
           }
     }
     
    foreach (DataRow drArt in TableArt.Rows) /
    {
    // Une exception sera levée ici : Impossible d'accéder via la ligne aux informations de ligne supprimées. 
    }
     
    Je pensea vor ommis quelquechose, mais j'ai beau chercher sur google, je tombe sur de nombreuses méthodes différentes, avec d'autres objets, et je commence à vraiment m'y perdre. 
     
    Je sais également que je pourrais faire mon "filtre" dans ma requete, certes, mais je souhaiterai bien comprendre la manipulation de ces DataTable.
     
    Je vous remercie d'avance de l'attention que vous porterez à ce message.
     
    Cordialement,
     
    Nixeus

  2. #2
    Inactif
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Algérie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 59
    Par défaut
    Bonjour,
    pour le petit souci que t'as, tu peux utiliser le filtre sur la table ... puisque t'as pas besoin de mettre a jour la base de données.
    tu n'as qu'as faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonDataTable.DefaultView.RowFilter= "ta condition en lgge sql";
    TonDataTable = TonDataTable.DefaultView.ToTable()
    de cette façon tu auras la nouvelle table qui contient les lignes (rows) correspondantes au filtre.

    J'espere que ceci répond a ta question ... sinon et bien poses moi d'autres questions...
    Bon courage ...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 133
    Par défaut
    Bonjour Nixeus

    foreach (DataRow drArt in TableArt.Rows) /
    {
    // Une exception sera levée ici : Impossible d'accéder via la ligne aux informations de ligne supprimées.
    }
    Tu veux accéder à des lignes que tu as supprimées ? Tu peux pas, puisque tu les as déjà supprimées !
    _row.Delete();
    Aucune ambiguïté, la ligne de DataTable est réellement supprimée, donc tu ne peux plus y faire appel plus loin dans le code.
    ..et je commence à vraiment m'y perdre.
    Rassures-toi, nous sommes tous passés par là, et régulièrement cela m'arrive encore. Quand tu as besoin d'aide, toute la communauté va s'efforcer de t'aider.
    ...Je sais également que je pourrais faire mon "filtre" dans ma requete, certes, mais je souhaiterai bien comprendre la manipulation de ces DataTable.
    Effectivement, si tu veux faire autre chose avec les mêmes données, il est plus judicieux de poser un filtre sur ton DataTable, travailler avec le résultat, reposer un autre filtre et travailler avec un autre jeu de résultat, et ainsi de suite.
    Je suis d'accord avec toi, il est important de comprendre le fonctionnement basique du DataTable car il te permet de te sortir de situations où tout espoir semble perdu !
    nachtigal.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    Citation Envoyé par nachtigal Voir le message
    Bonjour Nixeus


    Tu veux accéder à des lignes que tu as supprimées ? Tu peux pas, puisque tu les as déjà supprimées !

    Aucune ambiguïté, la ligne de DataTable est réellement supprimée, donc tu ne peux plus y faire appel plus loin dans le code.

    Rassures-toi, nous sommes tous passés par là, et régulièrement cela m'arrive encore. Quand tu as besoin d'aide, toute la communauté va s'efforcer de t'aider.

    Effectivement, si tu veux faire autre chose avec les mêmes données, il est plus judicieux de poser un filtre sur ton DataTable, travailler avec le résultat, reposer un autre filtre et travailler avec un autre jeu de résultat, et ainsi de suite.
    Je suis d'accord avec toi, il est important de comprendre le fonctionnement basique du DataTable car il te permet de te sortir de situations où tout espoir semble perdu !
    nachtigal.
    Merci à vous deux pour votre investissement;

    Je vais éssayer le rowfilter, que je ne connaissais pas.

    En revanche nachtigal, je ne cherche pas à accéder à des lignes supprimées, je veux juste supprimer les lignes avec un stock à 0, ce traitement est fais dans mon ForEach.

    Dans le ForEach d'après, je voudrais accéder au reste ( c'est a dire, ce qui reste après la suppression, c'est à dire, mes lignes avec un stock différent de zéro)

    Tu comprends ?

    Encore merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 526
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 526
    Par défaut
    C'est bizarre.
    Moi, pour ce genre de problématique, je passe par des DataView
    http://msdn.microsoft.com/fr-fr/libr...ew(VS.80).aspx

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Nixeus Voir le message
    Je pense arriver à supprimer ma ligne, mais il doit y avoir un soucis de mise à jour entre mes rows et mon DataTable.
    Essaye d'appeler tableArt.AcceptChanges() après avoir fait tes suppressions de lignes.
    Citation Envoyé par MSDN
    When AcceptChanges is called, any DataRow object still in edit mode successfully ends its edits. The DataRowState also changes: all Added and Modified rows become Unchanged, and Deleted rows are removed.

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Plusieurs choses
    1- Les dataview c'est effectivement une bonne maniere de filtrer, trier, rechercher dans une datatable

    2- Evite de modifier une collection dans un parcours foreach : le for next est plus approprié ici !!

    3- Le delete ne supprime pas PHYSIQUEMENT le Row la reference subsiste toujours avec un RowState deleted !

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    Citation Envoyé par olibara Voir le message
    Plusieurs choses
    1- Les dataview c'est effectivement une bonne maniere de filtrer, trier, rechercher dans une datatable

    2- Evite de modifier une collection dans un parcours foreach : le for next est plus approprié ici !!

    3- Le delete ne supprime pas PHYSIQUEMENT le Row la reference subsiste toujours avec un RowState deleted !
    Je trouve ca vraiment dommage de devoir passer d'un DataTable à un DataView pour faire ce genre de chose. On est censé gagner du temps avec c#, mais j'ai l'impression que ca n'est pas toujours le cas, pourquoi devoir passer de DataTable à DataAdapter à DataView...etc

    Si le delete ne supprime pas physiquement ma row , alors si on reviens à mon premier message, comment faire ? AcceptChanges ne semble pas résoudre mon problème.

    Merci

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Par défaut
    Citation Envoyé par Nixeus Voir le message
    AcceptChanges ne semble pas résoudre mon problème.
    Bizarre ça. J'ai essayé et ça fait exactement ça : ça retire de table.Rows les lignes qui ont le statut supprimé.

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut d'abord il ne faut pas tout melanger et pour gagner du temps il faut aussi prendre le temps de comprendre (on est tous passé par là !!)

    Le DataAdapter c'est ta couche d'acces a la database
    La datatable c'est un ensemble de row issue de ta database via un datadapter mais que que tiu peux aussi construire a la main !!

    Un DataView c'est une Vue sur ta datatable c'est a dire une liste de reference sur les rows de ta datatable que tu peux trier et filtrer comme tu veux

    Dans ton cas c'est sans doute la meilleure chose a utiliser
    Le principe de ne pas effacer un row physiquement c'est précisément pour permettre une mise a jour différée dans la DB si nécessaire
    Mais une fois de plus, pour ton usage c'est un dataview qu'il faut utiliser

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    Bonjour,


    Je viens de ré-éssayer ce matin avec AcceptChanges, et tout fonctionne ! J'avais du me tromper hier alors.

    Voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach (DataRow _row in TableArt.Rows)
    {
            if (Double.Parse(_row.ItemArray.GetValue(2).ToString()) == 0)
            {
                   _row.Delete();
     
            }
     }
    TableArt.AcceptChanges();
    En éspérant que ce petit post puis servire à d'autre je vous remercie tous d'avoir répondus à mon message. Quand j'aurai un peu plus e temps, je vais me faire un petit projet vs2008 avec les DataView, DataAdapter,etc... histoire de tout "mettre à plat".

    Encore merci.

    Cordialement,
    NIxeus

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour

    Plusieurs chose encore

    1- Je repete que c'est une tres mauvaise idee de modifier une collection dans un parcours foreach !! : utilise le for next

    2- C'est aussi une tres mauvaise idée d'acceder un elément de row par un ordinal et via l'itemarray en plus !!
    Utilise un acces nominatif

    _row["MonDouble"]

    3- Pourquoi tiens tu absolument a effacer ces row ? il y a t-il une raison dans le traitement ultérieur
    Il me semble que dans ce cas ci, un filtre ou meme ne pas charger les row lors du query serait préférable .. ??

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    Bonjour,

    1) Pourquoi le forEach n'est pas adapté ? ( je ne comprend pas pourquoi)
    2) Pour l'accès nominatif, je vais me renseigner la dessus, ej en connaissai pas cette méthode.
    3) Pour le fait de faire cette suppression c'est assez simple, en fait ma requete SQL utilise un driver ODBC Sage, driver qui a quelques limitation et qui malheureusement n'arrive pas à m'exclure mes lignes ayant un stock à 0 ( je connais SQL, et après avoir tout éssayé ( having...etc..) ca ne passe pas), c'est la raison pour laquelle je fais ce traitement ultérieurement.

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    1) Pourquoi le forEach n'est pas adapté ? ( je ne comprend pas pourquoi)
    Parce que si tu modifie ta collection dans une enumeration implicite (foreach) et que cette modification change la reference d'un element tu va ramasser une exception ! Faire un delete ou un add dans une collection que tu itere est dangereux et il faut bien comprendre ce qui se passe pour eviter de se casser la figure. C'est comme si on ajoutait au retirait une marche pendant que tu monte un escalier !!


    2) Pour l'accès nominatif, je vais me renseigner la dessus, ej en connaissai pas cette méthode
    Mieux vaut tard que jamais


    3) Pour le fait de faire cette suppression c'est assez simple, en fait ma requete SQL utilise un driver ODBC Sage, driver qui a quelques limitation et qui malheureusement n'arrive pas à m'exclure mes lignes ayant un stock à 0 ( je connais SQL, et après avoir tout éssayé ( having...etc..) ca ne passe pas), c'est la raison pour laquelle je fais ce traitement ultérieurement.
    Si tu connais sql tu devrais plutot essayer de comprendre pourquoi un filtre aussi elementaire qu'un where ne te donne pas le résultat attendu avant de bricoler des truc incongru dans ton code !!


    Mais bon d'un autre coté c'est en essayant beaucoup de chose qu'on apprends beaucoup de choses

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    281
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 281
    Par défaut
    En effet, pour le ForEach, j'ai déja eu cette exception.
    Je pensais qu'un For - Next ferait la même chose qu'un ForEach, mais tu veux dire en fait que si je fais un for qui va jusqu'un count(), je n'aurai pas ce problème dans la mesure ou mon nombre d'élément sera ré-évalué à chaque bouclage.

    Comme je fais le AcceptChanges à la fin de la boucle je n'ai pas le soucis.
    Si j'avais fais le AcceptChanges après le delete() et donc, dans la boucle alors oui j'aurai eu ce soucis dans un ForEach.

  16. #16
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bon maintenant il reste a apprendre comment faire ton query sql pour eviter tout ce bricolage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] petit soucis d'insert sur deux table
    Par speedylol dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/02/2009, 12h09
  2. Petits soucis de tri sur un vecteur
    Par d.jphilippe dans le forum Fortran
    Réponses: 3
    Dernier message: 01/08/2008, 23h00
  3. [Debian_Etch] Petits soucis de performance sur un serveur
    Par Arnulf dans le forum Administration système
    Réponses: 7
    Dernier message: 22/01/2008, 17h09
  4. Réponses: 8
    Dernier message: 04/08/2006, 15h24
  5. petit soucis pour lire sur un port usb le createfile n'accep
    Par anthonycosson dans le forum Windows
    Réponses: 5
    Dernier message: 14/02/2006, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo