Getchanges deleted rows

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 - 19 févr. 2008 à 16:31
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008 - 1 mai 2008 à 18:21
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

olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
19 févr. 2008 à 18:58
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 ...
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
19 févr. 2008 à 23:15
Pour ceux que ca interesse, j'ai trouvé plus simple encore !!
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
29 avril 2008 à 15:01
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
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
29 avril 2008 à 15:10
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;
    }
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
29 avril 2008 à 17:08
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
29 avril 2008 à 17:35
en plus a quoi sert
MySqlCommandBuilder cb = new MySqlCommandBuilder(adaChauffUpd);
puisque c jamais  utilisé

fontome viendra le soir ,vous hantez faites gaf
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
29 avril 2008 à 18:26
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 ...
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
29 avril 2008 à 23:48
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
29 avril 2008 à 23:48
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
30 avril 2008 à 21:56
merci comme meme
fontome viendra le soir ,vous hantez faites gaf
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
30 avril 2008 à 22:35
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 ......
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
30 avril 2008 à 23:23
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
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
30 avril 2008 à 23:41
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 00:39
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 00:41
je corrige: il  doit tester  si il a y un update a faire...................

fontome viendra le soir ,vous hantez faites gaf
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
1 mai 2008 à 09:39
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 13:19
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 .
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
1 mai 2008 à 14:59
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
0
cs_fontome_123 Messages postés 13 Date d'inscription lundi 28 février 2005 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 17:44
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
0
olibara Messages postés 666 Date d'inscription dimanche 16 décembre 2007 Statut Membre Dernière intervention 11 mars 2010 6
1 mai 2008 à 17:53
C'est bien ca !
0
Rejoignez-nous