Mise à jour automatique des valeurs dans la base de données à partir de DataGridView
je travaille actuellement sur un projet utilisant MySql en combinaison avec C#. Les données pour le DataGridView sont fournies par une jointure de plusieurs tables dans la base de données. Pour afficher les données j'utilise la suite, le travail, le code:
adapter.SelectCommand = new MySqlCommand(
" SELECT" +
" l.lot AS Lot, "+
" m.comment AS Bemerkungen," +
... (multiple columns from different tables) ...
" FROM m " +
" JOIN m2p ON m.m2p_id = m2p.id" +
... (more joins) ...
, this._mySqlConnection);
dataGridView1.DataSource = data;
adapter.Fill(data);
maintenant l'utilisateur de l'interface graphique est autorisé à modifier une certaine colonne (la colonne "Commentaire"). J'ai donc assigné un eventHandler au CellEndEdit
événement et lorsque l'utilisateur a modifié le permis de colonne adapter.Update(data)
est appelée. Maintenant cela ne fonctionne pas correctement action.
Pour définir mon updatecommand j'ai utilisé le code suivant:
adapter.UpdateCommand = new MySqlCommand(
" UPDATE m" +
" JOIN l ON m.l_id = l.id" +
" SET m.comment = @comment" +
" WHERE l.lot = @lot"
, this._mySqlConnection);
adapter.UpdateCommand.Parameters.Add("@comment", MySqlDbType.Text, 256, "Bemerkungen");
adapter.UpdateCommand.Parameters.Add("@lot", MySqlDbType.Text, 256, "Lot");
pouvez-vous m'expliquer comment je répare mon code pour mettre à jour automatiquement la base de données?
modifier: ajout d'un code source supplémentaire:
private MySqlDataAdapter warenlagerMySqlDataAdapter, kundenMySqlDataAdapter;
private DataTable warenlagerData, kundenData;
private DataGridView warenlagerGridView;
private void updateWarenlagerView(object sender, EventArgs e) {
warenlagerMySqlDataAdapter.Update(warenlagerData);
}
private void initialzeFields() {
warenlagerGridView.CellEndEdit += new DataGridViewCellEventHandler(this.updateWarenlagerView);
warenlagerMySqlDataAdapter = new MySqlDataAdapter();
warenlagerData = new DataTable();
}
private void initializeWarenlagerView() {
warenlagerMySqlDataAdapter.SelectCommand = new MySqlCommand(
" SELECT" +
" c.name AS Ursprung, " +
" m2p.art_nr AS ArtNr," +
" m.delivery_date AS Eingangsdatum," +
" CONCAT(FORMAT(m.delivery_amount / 100, 2), 'kg') AS Eingangsmenge, " +
" l.lot AS Lot," +
" m.quality AS Qualität," +
" m.comment AS Bemerkungen," +
" CONCAT(m.units, 'kg') AS Units," +
" CONCAT(FORMAT(s.amount / 100, 2), 'kg') AS Lagermenge, " +
" FORMAT(m.base_price / 100, 2) AS Einkaufspreis," +
" FORMAT(s.amount/10000 * m.base_price, 2) AS Wert" +
" FROM mushrooms AS m " +
" JOIN mushroom2path AS m2p ON m.mushroom2path_id = m2p.id" +
" JOIN countries AS c ON m.origin_id = c.id" +
" JOIN lots AS l ON m.lot_id = l.id" +
" JOIN stock AS s ON s.mushrooms_id = m.id"
, this._mySqlConnection);
warenlagerGridView.DataSource = warenlagerData;
warenlagerMySqlDataAdapter.Fill(warenlagerData);
warenlagerMySqlDataAdapter.UpdateCommand = new MySqlCommand(
" UPDATE mushrooms AS m" +
" JOIN lots AS l ON m.lot_id = l.id" +
" SET m.comment = @comment" +
" WHERE l.lot = @lot"
, this._mySqlConnection);
warenlagerMySqlDataAdapter.UpdateCommand.Parameters.Add("@comment", MySqlDbType.Text, 256, "Bemerkungen");
warenlagerMySqlDataAdapter.UpdateCommand.Parameters.Add("@lot", MySqlDbType.Text, 256, "Lot");
}
Ceci est le code entier concernant ce problème. Je suis sûr à 100% de la adapter.Update(data)
méthode est appelée (débogage). Et les données qui sont transmises au adapter.Update()
méthode contient les nouvelles données.
5 réponses
veuillez essayer cette requête de mise à jour qui fonctionne.
UPDATE mushrooms
SET comment = @comment
WHERE
l_id=(select id from l where lot=@lot)
votre déclaration de mise à jour est incorrecte. Il devrait être:
"UPDATE m FROM mushrooms m JOIN lots l ON m.lot_id = l.id SET m.comment = @comment WHERE l.lot = @lot"
avez-vous oublié d'exécuter le warenlagerMySqlDataAdapter.UpdateCommand? Vous définissez juste la commande et les paramètres mais ne l'exécutez pas.
ce que je vois c'est que vous appelez la mise à jour quand l'info est mise à jour, mais votre commande de mise à jour n'est pas chargée.
Appelez simplement updateWarenlagerView
lorsque vous mettez à jour la ligne, mais où êtes-vous appeler initialzeFields
?
essayez de déplacer votre code de mise à jour de CellEndEdit
événement CellValueChanged
événement et de voir si cela fonctionne.
Essayez cet exemple:
public void UpdateAllFromDgv(DataGridView dataGridView1)
{
string query = "Update List set ColumnName1=@Value1" +
",ColumnName2=@Value2" +
",ColumnName3=@Value3" +
",ColumnName4=@Value4" +
",ColumnName5=@Value5" +
",ColumnName6=@Value6 where ColumnName0=@Value0";
try
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
using (MySqlConnection con = new MySqlConnection(ConnectionString))
{
using (MySqlCommand cmd = new MySqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@Value0", row.Cells[0].Value);
cmd.Parameters.AddWithValue("@Value1", row.Cells[1].Value);
cmd.Parameters.AddWithValue("@Value2", row.Cells[2].Value);
cmd.Parameters.AddWithValue("@Value3", row.Cells[3].Value);
cmd.Parameters.AddWithValue("@Value4", row.Cells[4].Value);
cmd.Parameters.AddWithValue("@Value5", row.Cells[5].Value);
cmd.Parameters.AddWithValue("@Value6", row.Cells[6].Value);
con.Open();
cmd.ExecuteNonQuery();
dataGridView1.ResetBindings();
con.Close();
}
}
}
}
catch (MySqlException MsE)
{
MessageBox.Show(MsE.Message.ToString());
}
}