Getchanges deleted rows

Signaler
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
-
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008
-
Bonjour

J'utilise la methode getchanges pour connaitre les rows modifiés par un datagridview dans un dataset

pour added et modified ca semble facile mais pour deleted, j'ai bien un row avec satus deleted je ne vois pas de data
Comment puis-connaitre la clef originale afin d'appliquel de delete dans la DB ??

21 réponses

Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Bonjour


Comme tout le monde semble muet pour toute qustion d'update de DB je vais fournir le resultat de mes essais-erreurs, cela sertvira peut-etre a d'autres .....


Comment mettre a jour une DB a partir d'un DataGridView ?
Le datasource du DataGridView est un dataset rempli avec un datadapter

Premiere chose :
Remplir un dataset avec les modifications demandées

ch = dsAddr.GetChanges();
(ceci chargera un dataset avec tous les rows modifies et leurs status)
J'ai été surpris de voir que les rows déletés apparaisaient sans data visible (avec le debugger) mais la methode update se débrouille tres bien avec

Cependant Getchange() peut etre appelé avec un type de modification souhaité 
Voici un exemple pour l'operation Delete :

      DataSet ch = new DataSet();         // declaration du dataset temporaire pour charger les rows a traiter
      ch = dsAddr.GetChanges(DataRowState.Deleted);  // chargement des rows deleté
// construction de la commande SQL de delete
      adaAddr.DeleteCommand = new MySqlCommand("DELETE FROM address WHERE addrID=?addrID", conn);
// construction du parametrage de la commande delete
      adaAddr.DeleteCommand.Parameters.Add("?addrID", MySqlDbType.Int32, 11, "addrID").SourceVersion = DataRowVersion.Original;
// execution du delete
      adaAddr.Update(ch);
// ET VOILA
// J'ai peut etre réveillé ici quelques spécialiste qui pousseront des cris d'horreurs pour dirte que c'est pas comme ca qu'il faut faire mais tant mieux car jusqu'ici : Silence Radio ........

En tout cas ca marche
Pour UPDATE et INSERT je vais encore investiguer mais il semble que la construction de la commande soit plus fastitieuse car il faut enumerer tous les champs...
A suive ...
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Pour ceux que ca interesse, j'ai trouvé plus simple encore !!
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

bonjour
si c'est possible tu as dit que tu as troouvé un truc plus simple c quoi
fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Tiens !!


Première réaction depuis deux mois !


Fantome pas tres actif sur ce sujet

Exemple ci apres :

    // **************************************************************************
    private void do_UpdChauf()
    {


      MySqlCommandBuilder cb = new MySqlCommandBuilder(adaChauffUpd);
      DataSet ch = new DataSet();
      ch = dsChauffUpd.GetChanges(DataRowState.Deleted);


      if (null != ch)
      {
        int del = adaChauffUpd.Update(ch);
      }
      ch = dsChauffUpd.GetChanges(DataRowState.Modified);
      if (ch != null)
      {
        int upd = adaChauffUpd.Update(ch);
      }


      ch = dsChauffUpd.GetChanges(DataRowState.Added);
      if (ch != null)
      {
        int add = adaChauffUpd.Update(ch);
      }
      return;
    }
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

euh ca fait juste qql jours que je galere avec cette DGV
en faite moi je develope avec vbnet2005
donc j'ai convertie ton code
mais il m'affiche une erreur au niveau de :
ch = dsChauffUpd.GetChanges(DataRowState.Modified
il me dit: Object reference not set to an instance of an object.
en fait je veux savoir pour adaChauffUpd tu le crée a nouveau ou bien tu utilise celui avec quoi tu as crée la dataset, car moi je crée un autre mais moi ca marche pas
fontome viendra le soir ,vous hantez faites gaf
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

en plus a quoi sert
MySqlCommandBuilder cb = new MySqlCommandBuilder(adaChauffUpd);
puisque c jamais  utilisé

fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Salut

1- adachaufupd c'est l'adapteur utilisé poutr la requete du fill de ton DGV et c'est LUI que tu dois utiliser car c'est LUI qui connait l'information de la DB

2- Ne te fie pas aux apparence ! MySqlCommandBuilder est Essentiel et c'est la que reside toute la magie de la chose, il va preparer dans l'adapter les syntaxes SQL de mise a jour qui te permet les commandes suivantes ...
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

okok
enfin ca marche jsute 2 truc
->1er :remarque il faut mettre(en c#) int add = adaChauffUpd.Update(ch.tables(0)); 'pour que ca marche sinon tu aurra droit a une erreur [(0)supposant qu'on veux la 1er table].
->2eme :question le test que tu fait
(ch != null)
c'est pour verifier le dataset est vide? si c'est vrai comment en fait vbnet2005 stp si tu as un idee?

fontome viendra le soir ,vous hantez faites gaf
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

okok
enfin ca marche jsute 2 truc
->1er :remarque il faut mettre(en c#) int add = adaChauffUpd.Update(ch.tables(0)); 'pour que ca marche sinon tu aurra droit a une erreur [(0)supposant qu'on veux la 1er table].
->2eme :question le test que tu fait
(ch != null)
c'est pour verifier le dataset est vide? si c'est vrai comment en fait vbnet2005 stp si tu as un idee?

fontome viendra le soir ,vous hantez faites gaf
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

merci comme meme
fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Hola hola !

Tu crois que je dors dans le forum en attendant les apparitions du fantome de l'opera !

1- d'abord la methode update de l'adapter MySql prends un DataSet ET PAS une datatable comme tu l'imagine

2- Je ne sais pas comment VB gere les null de mémoire c'est "nothing" je pense

3- Fantome devrait aussi un peu hanter la doc ......
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

justement le fontome hante la doc qq fois c'est pour quoi il t'apporte cette info
 Adapter.Update(objdataset1.GetChanges(DataRowState.Unchanged),  _               objdataset1.Tables(0).ToString)
pour eviter la generation d'execption lors du 2eme update.
pour le test de null ca marche tjr pas meme nothing
tu as des connaissance en oracle?

fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Non
Je n'ai pas de connaissances Oracle, j'utilise MySql

Qu'est ce qui ne marche pas ?
Quel est ton code exact

E vb ca devrait etre

If ch Is Nothing Then return
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

enfaite le teste marche mnt mais n'est pas valide il tester si il y un update a faire avant d'effecuter l'update sinon directe excepetion
mon code est le suivant :

Public Function updatedataset(ByVal objdataset1 As DataSet)
        Dim requete As String
        Try

            requete = "select  blablabla from bloblo"
            command = New OracleCommand(requete, connection)
            command.Connection() = connection
            'Pour modifier les valeurs changées dans le DataAdapter
            ObjetCommandBuilder = New OracleCommandBuilder(Adapter)
            If objdataset1 Is Nothing Then
            Else
                Adapter.Update(objdataset1.GetChanges(DataRowState.Modified), _
                      objdataset1.Tables(0).ToString)
            End If
            If objdataset1 Is Nothing Then
            Else
                Adapter.Update(objdataset1.GetChanges(DataRowState.Unchanged), _
                                objdataset1.Tables(0).ToString)
                objdataset1.Tables(0).AcceptChanges()
            End If
            Adapter.Fill(objdataset1, "name1")
            Return objdataset1
        Catch ex As Exception
            MsgBox(ex.Message & "operation ko")
        Finally
            fermeture()
        End Try
    End Function

fontome viendra le soir ,vous hantez faites gaf
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

je corrige: il  doit tester  si il a y un update a faire...................

fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Si tu faisais un effort pour parler francais d'abord
Et puis commenter un peu ton code


Ensuite revoir la logique de test de ton objectdataset1 (voila un nom tres explicite )
Il me semble que s'il est nul tu ne devrais meme pas appeller ta fonction ou au moins en sortir tout de suite plutot que d'ecrire ton spaghetti pas facile a relire
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

Bonjour


bon
pour le français on fais avec ce qu'on a comme moyen de bort.

et à  parement ça passe peu être les abréviations je vais arrêter de les
utiliser, si le problème se situe la


NB :
ne critique pas ce que tu ne sais pas car tu ne sais comment je travail et ce
que code il est  en phase de test donc pas
encore intégrer a l’application ce qui ne demande pas nécessairement un nom
significatif au début.


2eme - le code  : le problème c'est pas seulement le
test si le dataset est vide ou non,


c'est vrai d'un coté c’est un test nécessaire mais pas
suffisant il faut tester s'il y a des rows ou des  cells qui ont changer 
pour faire un update dans le cas contraire :

c'est a dire pas de changement et  tu
fais comme même un update ça génère une exception


mon code et le suivant (avec du commentaire)




      Try
'phase pour ce connecter a la base  connection (attribut class)
            requete = "select  * from bloblo"
            command = New OracleCommand(requete, connection)
            command.Connection() = connection
'ta commande magique   
           ObjetCommandBuilder = New OracleCommandBuilder(Adapter)
'Pour modifier les valeurs changées dans le Dataset
            If objdataset1 Is Nothing Then 'test si le dataset est vide
            Else
                Adapter.Update(objdataset1.GetChanges(DataRowState.Modified), _
                      objdataset1.Tables(0).ToString)'ici j'indique  la table sur la quelle il y a la mise jour
            End If
'Pour verifier les valeurs inchangées dans le Dataset
            If objdataset1 Is Nothing Then
            Else
                Adapter.Update(objdataset1.GetChanges(DataRowState.Unchanged), _
                                objdataset1.Tables(0).ToString)
                'Pour delete les valeurs supprimer dans le Dataset
            End If
            If objdataset1 Is Nothing Then
            Else
                Adapter.Update(objdataset1.GetChanges(DataRowState.Deleted), _
                                objdataset1.Tables(0).ToString)

            End If
            objdataset1.Tables(0).AcceptChanges()


' pour valider les changement au niveau du dataset non au niveau de la base
            Adapter.Fill(objdataset1, "chasseur")
            Return objdataset1
        Catch ex As Exception
            MsgBox(ex.Message & "operation ko")
        Finally
            fermeture()
        End Try
























fontome viendra le soir ,vous hantez faites gaf
faut jamais tout croire .
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
Si le français que tu ecrit est le seul que tu maitrise, c'est quoi ta langue maternelle ?

objdataset1 est donc ton DS de travail

Je te conseile de passer par un DS temporaire de traitement des modif  (je l'ai montré dans mon exemple)
C'est plus explicite et plus lisible
ca devrait +/- donner en VB 

          DataSet  DStmp=objdataset1.GetChanges(DataRowState.Modified),objdataset1.Tables(0).ToString)
          if  not (DStmp is nothing) then
                Adapter.Update(DStmp)
          endif
Messages postés
13
Date d'inscription
lundi 28 février 2005
Statut
Membre
Dernière intervention
1 mai 2008

voila une bonne  question( langue maternelle...) tu commence a voir les choses d'un autre angle c'est bien.
oui il le faut  pour le objdataset mais quand je fais ce que tu me conseil il me genere  des exception meme dés le 1er update donc j'ai preferer passer directement par la objdataset
mais si je compred bien quand tu fais un
dim DStmp as new dataset
DStmp=objdataset1.GetChanges(DataRowState.Modified),objdataset1.Tables(0).ToString)
          if  not (DStmp is nothing) then
                Adapter.Update(DStmp)
          endif
c'est comme si le DStmp va recuperer que ce qui etait mise a jour donc le fait de tester est qu'il vide ou non resoudrera le prb
c'est bien ca?

fontome viendra le soir ,vous hantez faites gaf
Messages postés
666
Date d'inscription
dimanche 16 décembre 2007
Statut
Membre
Dernière intervention
11 mars 2010
5
C'est bien ca !