OVH Cloud OVH Cloud

parcours dataset et suppression rows

4 réponses
Avatar
Rahan
Salut a tous

j ai charge via prog. 1 dataset avec une table (sans la
structure)
da.fill(ds,"table")

en fait je dois maintenant parcourir la collection et
mettre a jour un champ qui fait parti de la cle

donc je voulais supprimer la ligne courante puis en
recreer une en y inserant mes nouvelles valeurs
mais j ai un msg me disant que la collection a change ett
qu il n arrive pas a faire le next (ce qui me parait
normal)
for each dr in ds.table(0).rows
if critere then
dr.delete
...
endif
next

je pense qu il y a un moyen pour faire cette suppression
mais comment ?????

4 réponses

Avatar
Julien Adam
La solution générique est d'avoir une autre collection avec les lignes à
modifier. Tu pourras alors agir à ta guise sur ta collection principale sans
avoir l'erreur que tu as mentionnée.

Première méthode. Crée un tableau temporaire, parcours ta collection
originelle et stocke les lignes qui correspondent à ton critère. Parcours ce
tableau temporaire, effectue tes modifications et efface le tableau
temporaire.

Deuxième méthode. Si ton critère est suffisamment générique, passe par
ds.Table[0].Select("critère"), ça te renverra un tableau avec les lignes à
modifier.

Et enfin il reste toujours la bonne vieille méthode du for(int i = 0; i <
ds.Table[0].Rows.Count; i++) mais il faut faire très attention aux index et
bien penser aux problèmes de concurrence d'accès...

Julien Adam

"Rahan" wrote in message
news:a15601c4792e$cec107f0$
Salut a tous

j ai charge via prog. 1 dataset avec une table (sans la
structure)
da.fill(ds,"table")

en fait je dois maintenant parcourir la collection et
mettre a jour un champ qui fait parti de la cle

donc je voulais supprimer la ligne courante puis en
recreer une en y inserant mes nouvelles valeurs
mais j ai un msg me disant que la collection a change ett
qu il n arrive pas a faire le next (ce qui me parait
normal)
for each dr in ds.table(0).rows
if critere then
dr.delete
...
endif
next

je pense qu il y a un moyen pour faire cette suppression
mais comment ?????



Avatar
Rahan
merci pour ta reponse

en effet j ai opte pour une table temporaire ou je stock
mes valeurs
mais si je veux mettre a jour ma bdd comment faire pour
qu il supprime ancienne ligne et ajoute les nouvelles
(rowstate ou ??? creer un nouveau da2)
da.update(ds,"table")


-----Message d'origine-----
La solution générique est d'avoir une autre collection


avec les lignes à
modifier. Tu pourras alors agir à ta guise sur ta


collection principale sans
avoir l'erreur que tu as mentionnée.

Première méthode. Crée un tableau temporaire, parcours


ta collection
originelle et stocke les lignes qui correspondent à ton


critère. Parcours ce
tableau temporaire, effectue tes modifications et efface


le tableau
temporaire.

Deuxième méthode. Si ton critère est suffisamment


générique, passe par
ds.Table[0].Select("critère"), ça te renverra un tableau


avec les lignes à
modifier.

Et enfin il reste toujours la bonne vieille méthode du


for(int i = 0; i <
ds.Table[0].Rows.Count; i++) mais il faut faire très


attention aux index et
bien penser aux problèmes de concurrence d'accès...

Julien Adam

"Rahan" wrote in


message
news:a15601c4792e$cec107f0$
Salut a tous

j ai charge via prog. 1 dataset avec une table (sans la
structure)
da.fill(ds,"table")

en fait je dois maintenant parcourir la collection et
mettre a jour un champ qui fait parti de la cle

donc je voulais supprimer la ligne courante puis en
recreer une en y inserant mes nouvelles valeurs
mais j ai un msg me disant que la collection a change




ett
qu il n arrive pas a faire le next (ce qui me parait
normal)
for each dr in ds.table(0).rows
if critere then
dr.delete
...
endif
next

je pense qu il y a un moyen pour faire cette




suppression
mais comment ?????





.



Avatar
Julien Adam
Par exemple :
ds.Table[0].Rows[42].Delete();
DataRow n = ds.Table[0].NewRow();
n["id"] = 47;
etc...
ds.Table[0].Rows.Add(n);

et ensuite appelle Update() sur ton DataAdapter. Toutes les lignes effacées
seront effacées par la DeleteCommand du DataAdapter. Toutes les lignes
modifiées seront mises à jour par UpdateCommand et toutes les nouvelles
lignes seront insérées par InsertCommand. Il faut donc bien spécifier ces 3
propriétés avant l'appel à Update().

D'ailleurs en fait tu n'as pas besoin de table temporaire pour effacer les
lignes car Delete() ne retire pas la ligne de la collection, ça ne fait que
marquer la ligne comme étant effacée. C'est l'appel à Add qui doit poser
problème. (Ca ne change rien à ton problème mais c'est un point qu'il
fallait préciser).

Julien

"Rahan" wrote in message
news:a08c01c4793e$39576aa0$
merci pour ta reponse

en effet j ai opte pour une table temporaire ou je stock
mes valeurs
mais si je veux mettre a jour ma bdd comment faire pour
qu il supprime ancienne ligne et ajoute les nouvelles
(rowstate ou ??? creer un nouveau da2)
da.update(ds,"table")


-----Message d'origine-----
La solution générique est d'avoir une autre collection


avec les lignes à
modifier. Tu pourras alors agir à ta guise sur ta


collection principale sans
avoir l'erreur que tu as mentionnée.

Première méthode. Crée un tableau temporaire, parcours


ta collection
originelle et stocke les lignes qui correspondent à ton


critère. Parcours ce
tableau temporaire, effectue tes modifications et efface


le tableau
temporaire.

Deuxième méthode. Si ton critère est suffisamment


générique, passe par
ds.Table[0].Select("critère"), ça te renverra un tableau


avec les lignes à
modifier.

Et enfin il reste toujours la bonne vieille méthode du


for(int i = 0; i <
ds.Table[0].Rows.Count; i++) mais il faut faire très


attention aux index et
bien penser aux problèmes de concurrence d'accès...

Julien Adam

"Rahan" wrote in


message
news:a15601c4792e$cec107f0$
Salut a tous

j ai charge via prog. 1 dataset avec une table (sans la
structure)
da.fill(ds,"table")

en fait je dois maintenant parcourir la collection et
mettre a jour un champ qui fait parti de la cle

donc je voulais supprimer la ligne courante puis en
recreer une en y inserant mes nouvelles valeurs
mais j ai un msg me disant que la collection a change




ett
qu il n arrive pas a faire le next (ce qui me parait
normal)
for each dr in ds.table(0).rows
if critere then
dr.delete
...
endif
next

je pense qu il y a un moyen pour faire cette




suppression
mais comment ?????





.



Avatar
Rahan
ok c bon !!

effectivement c etait le newrow qui posait pb car la
collection etait modifiee quand je le faisait, je suis
donc passe par une table temp pour l ajout de ces
nouvelles lignes puis appeler a nouveau mon da.update
(temp)

en tout cas merci encore pour ces precisions

A+


-----Message d'origine-----
Par exemple :
ds.Table[0].Rows[42].Delete();
DataRow n = ds.Table[0].NewRow();
n["id"] = 47;
etc...
ds.Table[0].Rows.Add(n);

et ensuite appelle Update() sur ton DataAdapter. Toutes


les lignes effacées
seront effacées par la DeleteCommand du DataAdapter.


Toutes les lignes
modifiées seront mises à jour par UpdateCommand et


toutes les nouvelles
lignes seront insérées par InsertCommand. Il faut donc


bien spécifier ces 3
propriétés avant l'appel à Update().

D'ailleurs en fait tu n'as pas besoin de table


temporaire pour effacer les
lignes car Delete() ne retire pas la ligne de la


collection, ça ne fait que
marquer la ligne comme étant effacée. C'est l'appel à


Add qui doit poser
problème. (Ca ne change rien à ton problème mais c'est


un point qu'il
fallait préciser).

Julien

"Rahan" wrote in


message
news:a08c01c4793e$39576aa0$
merci pour ta reponse

en effet j ai opte pour une table temporaire ou je stock
mes valeurs
mais si je veux mettre a jour ma bdd comment faire pour
qu il supprime ancienne ligne et ajoute les nouvelles
(rowstate ou ??? creer un nouveau da2)
da.update(ds,"table")


-----Message d'origine-----
La solution générique est d'avoir une autre collection


avec les lignes à
modifier. Tu pourras alors agir à ta guise sur ta


collection principale sans
avoir l'erreur que tu as mentionnée.

Première méthode. Crée un tableau temporaire, parcours


ta collection
originelle et stocke les lignes qui correspondent à ton


critère. Parcours ce
tableau temporaire, effectue tes modifications et efface


le tableau
temporaire.

Deuxième méthode. Si ton critère est suffisamment


générique, passe par
ds.Table[0].Select("critère"), ça te renverra un tableau


avec les lignes à
modifier.

Et enfin il reste toujours la bonne vieille méthode du


for(int i = 0; i <
ds.Table[0].Rows.Count; i++) mais il faut faire très


attention aux index et
bien penser aux problèmes de concurrence d'accès...

Julien Adam

"Rahan" wrote in


message
news:a15601c4792e$cec107f0$
Salut a tous

j ai charge via prog. 1 dataset avec une table (sans






la
structure)
da.fill(ds,"table")

en fait je dois maintenant parcourir la collection et
mettre a jour un champ qui fait parti de la cle

donc je voulais supprimer la ligne courante puis en
recreer une en y inserant mes nouvelles valeurs
mais j ai un msg me disant que la collection a change




ett
qu il n arrive pas a faire le next (ce qui me parait
normal)
for each dr in ds.table(0).rows
if critere then
dr.delete
...
endif
next

je pense qu il y a un moyen pour faire cette




suppression
mais comment ?????





.





.