olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 2010
-
19 févr. 2008 à 16:31
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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 ??
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 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 ...
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;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 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 ...
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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?
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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?
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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?
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 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
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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 .
olibara
Messages postés666Date d'inscriptiondimanche 16 décembre 2007StatutMembreDernière intervention11 mars 20106 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
cs_fontome_123
Messages postés13Date d'inscriptionlundi 28 février 2005StatutMembreDerniè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?