Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
si je comprends bien il effectue les modifs dans le dataset mais pas dans la base de données c'est sa ?
code actuel: j'ai testé de faire la requête mais en faite c'est comme si rien ne se passé !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public MySqlConnection maconnexion; public DataSet dataset_commande = new DataSet(); private MySqlDataAdapter adapter_commande; private void liste_Load(object sender, EventArgs e) { timer_reload.Enabled = true; // Connexion à la base de données string connexion = "Server=192.168.0.39;Port=3306;Database=db_commande;Uid=PSEUDO;Pwd=PW;"; maconnexion = new MySqlConnection(connexion); maconnexion.Open(); // Ouverture adapter_commande = new MySqlDataAdapter("SELECT co_ref, co_fich, co_dat, co_qte, co_del, co_com, co_sta, co_fac, co_imp, for_nom, gra_nom, pro_nom FROM commande,forma,grammage,produit WHERE co_for=for_id AND co_gra=gra_id AND co_pro=pro_id ORDER BY co_dat DESC", maconnexion); MySqlCommand cmd = maconnexion.CreateCommand(); cmd.CommandText = "UPDATE commande SET co_sta=@co_sta WHERE co_ref=@co_ref"; cmd.Parameters.Add("@co_sta", MySqlDbType.Int32, 0, "co_sta"); cmd.Parameters.Add("@co_ref", MySqlDbType.String, 0, "co_ref"); adapter_commande.UpdateCommand = cmd; adapter_commande.Fill(dataset_commande, "commande"); dataset_commande.Tables["commande"].PrimaryKey = new DataColumn[] { dataset_commande.Tables["commande"].Columns["co_ref"] }; DataView dataView_attente = new DataView(dataset_commande.Tables["commande"], "co_sta = 0", null, DataViewRowState.CurrentRows); dataGridView_attente.DataSource = dataView_attente; DataView dataView_termine = new DataView(dataset_commande.Tables["commande"], "co_sta = 1", null, DataViewRowState.CurrentRows); dataGridView_termine.DataSource = dataView_termine; } private void dataGridView_attente_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0 && e.ColumnIndex == details.Index) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.CurrentRow.DataBoundItem as DataRowView; drv.Row["co_sta"] = 1; adapter_commande.UpdateCommand.Parameters["@co_sta"].Value = drv.Row["co_sta"]; adapter_commande.UpdateCommand.Parameters["@co_ref"].Value = drv.Row["co_ref"]; adapter_commande.UpdateCommand.ExecuteNonQuery(); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
Ca passe automatiquement dans la grille du bas à cause des DataView, qui se mettent à jour automatiquement
Ben je sais pas, j'ai pas vu ce qu'il y avait dans ta base... Si tu redémarres l'application, la commande est dans quel statut ?
Mais je comprends pas comment la MessageBox s'affiche s'il y a eu une exception juste avant, vu que tu n'interceptes pas l'exception
Il y a une erreur ou pas finalement ?
EDIT: j'ai fait le test avec une table commande ou il y a juste les champs co_ref et co_sta, ça fonctionne sans problème avec ce code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 DataSet ds = new DataSet(); using (MySqlConnection cnx = new MySqlConnection("server=xxxxxxxx;user id=xxxxxx;password=xxxxxx;database=xxxxx")) { cnx.Open(); MySqlDataAdapter adapter = new MySqlDataAdapter("select * from commande", cnx); MySqlCommand cmd = new MySqlCommand("update commande set co_sta = @co_sta where co_ref = @co_ref", cnx); cmd.Parameters.Add("@co_sta", MySqlDbType.Int32, 0, "co_sta"); cmd.Parameters.Add("@co_ref", MySqlDbType.String, 0, "co_ref"); adapter.UpdateCommand = cmd; adapter.Fill(ds, "commande"); ds.Tables["commande"].PrimaryKey = new DataColumn[] { ds.Tables["commande"].Columns["co_ref"] }; ds.Tables["commande"].Rows[0]["co_sta"] = 1; adapter.Update(ds, "commande"); }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
teste la valeur de retour de ExecuteNonQuery :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int n = adapter_commande.UpdateCommand.ExecuteNonQuery(); MessageBox(n.ToString());
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Il retourne 0
sinon oui a chaque ouverture du formulaire sa va chercher la mise à jour dans la base de données donc j'ai juste a fermé puis à ouvrir pour voir si le changement existe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private void dataGridView_attente_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0 && e.ColumnIndex == details.Index) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.CurrentRow.DataBoundItem as DataRowView; drv.Row["co_sta"] = 1; adapter_commande.UpdateCommand.Parameters["@co_sta"].Value = drv.Row["co_sta"]; adapter_commande.UpdateCommand.Parameters["@co_ref"].Value = drv.Row["co_ref"]; int n = adapter_commande.UpdateCommand.ExecuteNonQuery(); MessageBox.Show(n.ToString()); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
Je comprends pas comment c'est possible... La commande existe forcément dans la base puisqu'elle vient du Fill
Je me demande si c'est pas un bug du connecteur MySQL... tu utilises quelle version du connecteur ? Et quelle version de la base ?
Ca répond pas à ma question
En fin de compte, la commande a été modifiée dans la base ou non ?
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
modifié dans la base de données: NON
mysql 5.1 (serveur)
mysql connector net 5.2.5 [MySQL Database (MySQL Data Provider)] (client)
Je crois que j'ai compris !!
En prime voici ma touche sur le code
Je pense que le fait de mettre drv.Row["co_sta"] = 1 exclu le row du dataview et que l'update n'a plus rien a se mettre sous la dent
Moi je me simplifierait la vie en ecrivent une commande SQL en dur.
ca donnerait ca
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 private void dataGridView_attente_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex != details.Index) { return; } updateRow(e.RowIndex); } private void updateRow(int iRow) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.Rows[iRow].DataBoundItem as DataRowView; drv.Row["co_sta"] = 1; adapter_commande.UpdateCommand.Parameters["@co_sta"].Value = drv.Row["co_sta"]; adapter_commande.UpdateCommand.Parameters["@co_ref"].Value = drv.Row["co_ref"]; adapter_commande.UpdateCommand.ExecuteNonQuery(); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); }
J'ai pas testé ni compilé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 private void updateRow(int iRow) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.Rows[iRow].DataBoundItem as DataRowView; string co_ref=drv.Row["co_ref"]; drv.Row["co_sta"] = 1; CommandText = string.format("UPDATE commande SET co_sta=1 WHERE co_ref={0}",co_ref) MySqlCommand cmd = new MysqlCommand(CommandText,maconnexion); cmd.ExecuteNonQuery(); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); }
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
1er code: n'inscrit toujours pas dans la base de données
2nd code: comporte des erreurs, j'essaie de corriger et je test (notamment format)
une premiere erreur certaine c'est
il faut faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE co_ref={0}
pcq co_ref est un string
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE co_ref='{0}'
Pour le reste a toi de jouer un peu !
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
en essayant de te corriger:
'string' ne contient pas de définition pour 'format'
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 private void updateRow(int iRow) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.Rows[iRow].DataBoundItem as DataRowView; string co_ref=drv.Row["co_ref"].ToString(); drv.Row["co_sta"] = 1; string CommandText; CommandText = string.format("UPDATE commande SET co_sta=1 WHERE co_ref='{0}'", co_ref); MySqlCommand cmd = new MySqlCommand(CommandText,maconnexion); cmd.ExecuteNonQuery(); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
string.Format !
J'avais dis : j'ai écrit sans verifier
Cherche un peu quand meme avant d'envoyer un message a chaque virgule qui hésite !
Pour Tomlev : je suis quand meme tres curieux de ce que mon code va donner : pour moi ca va marcher !
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Le Update tient compte du DataRowState, c'est lui qu'il faudrait verifier et je sent bien qu'il ne sera pas comme on l'attendsje suis certain que c'est pas ça le problème... la DataView est juste une vue des données de la table, le DataAdapter n'en tient aucun compte
De toute façon dans la manip prevue ici l'update n'est pas tres utile
Une bonne petite commande explicite est tres efficace !
Et si on veut on peut changer mon format par un parametre mais ma politique c'est que quand on comprends plus c'est back to basic asap j'usqu'au plus bete pour que ca marche !
Apres coup on remonte !
J'ai une bonne expérience en debuguage de tout genre
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Le DataRowState est à Modified après la modif du co_sta (j'ai vérifié quand j'ai fait mon test, cf. plus haut). Donc c'est bien pris en compte par le DataAdapter, d'ailleurs mon test a fonctionné...
Effectivement... mais perso j'évite de mélanger le mode déconnecté et le mode connecté, c'est un coup à introduire des incohérences entre la base et le dataset.
Et de toute façons, ExecuteNonQuery lui renvoie 0, ce qui veut dire que :
- soit aucune ligne n'a été updatée
- soit MySQL (ou le connecteur) a renvoyé 0, bien qu'un ligne ait été mise à jour. J'avais déjà remarqué un problème comme ça dans un site PHP, je sais pas trop à quoi c'est dû... En fait je crois que MySQL renvoie "0 lignes mises à jour" si on fait un update avec les mêmes valeurs... mais là en principe la valeur a du changer :S
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
+ 2 minutes de BAF
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Champion: Olibara
La commande passe bien dans la base de donnée !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 dataGridView_attente_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex != details.Index) { return; } updateRow(e.RowIndex); } private void updateRow(int iRow) { // obtenir la DataRow correspondant à la ligne courante du DataGridView DataRowView drv = dataGridView_attente.Rows[iRow].DataBoundItem as DataRowView; string co_ref = drv.Row["co_ref"].ToString(); drv.Row["co_sta"] = 1; string CommandText; CommandText = string.Format("UPDATE commande SET co_sta=1 WHERE co_ref='{0}'", co_ref); MySqlCommand cmd = new MySqlCommand(CommandText, maconnexion); cmd.ExecuteNonQuery(); MessageBox.Show("Commande " + drv.Row["co_ref"] + "\nTerminée !", "Validation", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Désolé de continuer à vous embêter mais mon sujet n'est pas clos, car il me reste à enregistrer les modifications apporter dans mon tableau:
récapitulatif de mon 1er post:
1) Les données de mon datagridview peuvent être modifiées par l'utilisateur, exemple s'il change une référence comment faire pour attribuer le changement dans la base de donnée ? bien sur le changement peut se faire sur toutes les lignes sauf la date.
Comment cela s'effectuerai ? un bouton enregistrez ? ou une mise à jour automatique ?
Et si tu cherchais un peu par toi meme maintenant !
Tu verra que les sujets faisant plus de 6 pages sont rarissime !
Le probleme c'est que tu mélange un peu les question purement techniques et les concept de design de ton app
Je pense que les efforts fourni par Tomlev pour t'aider meritent qu'a ton tour tu essaye de faire quelques efforts pour enrichir ton experience par toi meme !
Qu'en pense tu ?
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager