Super article ! Il faut que je fasse des essais et aue je recherche tous les updates de mon TableAdapter. Je vous tiens au courant.
Version imprimable
Super article ! Il faut que je fasse des essais et aue je recherche tous les updates de mon TableAdapter. Je vous tiens au courant.
Apres chaue update, je fais un AcceptChanges() et comme avant, les erreurs sont beaucoup moins nombreuses qu'avant mais existent toujours. Par exemple je copie 3500 lignes dans ma datagrid, je sauvegarde tout ca (Update + AcceptChanges() ok) et lorsque je veux toute les supprimer, il en supprime peut etre 2000 mais plante...
Pourtant apres chaue boucle de copy, add, modify et delete, je lance ma methode SaveItem() :
Du coup je ne voit pas pourquoi le progamme plante lorsque je teste sur des gros volumes (peut etre que le TableAdapter n'a pas le temps de se mettre a jour...).Code:
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 private void SaveItem() { // got focus on auto save checkbox just before saving just to validate the cell chkAutoSave.Focus(); this.Validate(); this.pARAMBindingSource.EndEdit(); if (this.paramDS.HasChanges()) { if (!this.paramDS.PARAM.HasErrors) { frmAppSplash frm = UIUtility.StartFlash("Saving changes.....", false); sel = UIUtility.GetSelected(dgvParams); UIUtility.UpdateModified(cLimitSetID, userid); this.pARAMTableAdapter.Update(this.paramDS.PARAM); this.paramDS.AcceptChanges(); dgvParams.ClearSelection(); SetSelected(sel); UIUtility.StopFlash(frm); } else { MessageBox.Show("Warning : Items not saved", "Saving Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } }
Si quelqu'un a une piste...
Bonjour,
Est-ce que la clause WHERE de la fonction Delete() du TableAdapter opère bien sur toutes les valeurs des champs?
D'où vient la DeleteCommand de l'Adapter ? Est-ce toi qui l' a écrite.
La delete command a ete generee a travers un utilitaire (en xsd) avec les options generate update and delete command.
En fait le probleme est cerne :
Je lance le programme
Je selectionne toutes les lignes de mq grid et je les duplique (fonction duplicate que j'ai codee qui permet de selectionner des lignes de ma grid et de les dupliquer)
Un auto save est realise (avec la methode que j'ai postee un peu plus haut)
Je selectionne toutes les lignes de ma grid et je delete.... PLANTAGE --> The DeleteCommand affected 0 of the 1 expected parameter.
Voila le probleme.
Maintenant si apres le duplicate je quitte et relance le programme, je peux supprimer toutes les lignes de la grid sans aucun probleme. Je pense qu'il faut faire une sorte de refresh de mon table adapter pour qu'il soit dans le meme etat que lorsque je lance l'application et qu'il charge les donnees.(pour un soucis de performances je ne peux pas le vider et le re-remplir a chaque fois).
Pourtant je fais bien un AcceptChanges() apres l'Update() dans ma methode SaveItem()...
Voila ou je suis bloque depuis presque 2 semaines
Bonjour,
Pour le Save :
Les enregistrements dupliqués ayant été sauvegardés sans problème, j'en déduis qu'il n'y a pas de clé primaire (unique) sinon la fonction aurait généré des exceptions style "Duplicate key".
Pour le Delete :
La commande SQL de suppression d'un enregistrement détruit tous les enregistrements correspondant à la clause WHERE de la commande DELETE :
- sur l'enregistrement source, le delete va supprimer à la fois l'enregistrement source et l'enregistrement copié,
- sur l'enregistrement copié, le delete ne vas plus rien avoir à supprimer, d'où l'erreur.
Solutions : Ignorer ce type d'erreur et compter le nombre total de delete réélement effectués (via, je pense, la property RowAffected de l'event OnRowUpdated du DBDataAdapter)
Bonjour Graffito,
Au niveau de mon duplicate, il y a une procedure Oracle affectee qui recupere un nouvel identifiant a chaque ligne cree dans la grid (paramID.nextval). Donc chaque ligne dupliquee a son propre identifiant (reconnut comme identifiant dans Oracle bien sur...).
Le fait que chaque ligne aie son identifiant remet il en cause ce que tu dis (la clause where dans la commande delete ) ? ou n'est-ce plus valable ?
Je verifie les suppressions dans la grid et la bas de donness en meme temps, c'est un autre debut de piste...
Au fait, parfois certaines UpdateCommand recommencent a planter, cela m'inquiete car je dois bientot avoir fini de fixer tous les bugs de l'appli et il ne me reste que ce probleme de tableAdapter.Update que je n'arrive pas a faire fonctionner correctement...
Bonjour,
Est-ce que le champ identifiant est bien dans la DataTable ?
Si oui, est-ce que la contrainte d'incrémentation automatique (ou d'unicité) de ce champ figure bien dans le DataTable ?
Si une des réponses est non, c'est probalement la source du problème.
Bonjour,
Le champ identifiant (paramid) fait partie du DataTable et est definit comme identifiant comme dans la BDD. Par contre son option AutoIncrement est a false. Je vais tester de le passer a true mais logiquement chaue ligne cree dans le DataTable insere un nouveau para;id definit par Oracle donc si j'auto-incremente en plus ce champ dans la dataTable il risque d'y avoir des plantages... Bref ca ne coute rien d'essayer.
Si quelqu'un a une autre idee...
Merci d'avance
En passant le paramid en AutoIncrement dans le DataTable, rien ne change...
La DeleteCommand plante toujours lors de la suppression d'une ligne qui vient d'etre cree (et dont j'ai deja applique Update() et AcceptChanges()).
Reste encore à vérifier que le test sur le paramId est bien intégré à la clause WHERE de la DeleteCommand du DataAdapter...
Je n'arrive pas a recuperer le code sql a chaud qui va generer la suppression du parametre (row). Je pense qu'il n'est pas passe a la fonction update() quand il s'agit d'une ligne qui vient d'etre cree (le AcceptChanges() est cense palier ce probleme...)
Quoique je change, cette erreur reste. Aucun moyen d'avoir le code sql qui declenche l'erreur afin de savoir si c'est bien l'update qui plante ou si il faut chercher en amont (ligne non presente dans le DataTable...).
Je pense que le DataAdapter ne met pas a jour le TableAdapter lorsque je cree une ligne dans la DataGrid (cette phrase fait un peu peur...).
Je continue les recherches et tiens au courant. Si quelqu'un a eu le meme probleme ou maitrise les TableAdapter, n'hesitez pas.
Merci
Personne pour donner son avis ?
Je reformule le probleme : Lorsque j'ajoute une ligne dans ma DatatGridView, je fais un Update() et un AcceptChanges() et tout se passe bien.
Par contre, si je veux modifier cette ligne nouvellement cree, l'Update() plante en me disant : The Update command affected 0 of the 1 parameter expected..
Bonjour, j'ai essaye tout plein de choses pour corriger ce probleme et ai beaucoup appris. Cependant, je reste encore bloque. J'ai re-ecrit les requetes d'ajout, de modif et de suppression de mon TableAdapter et ca plante toujours au meme endroit :
Impossible de modifier une ligne que je vient de creer. Pourtant cette ligne existe bien dans la base de donnees, dans le TableAdapter, le Dataset et le DataGridview. Les modifications ne passent pas. Je peux cependant les faire que si je quitte le programme et que je le relance.