【问题标题】:Automatically Update Values in Database from DataGridView从 DataGridView 自动更新数据库中的值
【发布时间】:2013-05-17 03:53:19
【问题描述】:

我目前正在开发一个将 MySql 与 C# 结合使用的项目。 DataGridView 的数据由数据库中多个表的连接提供。为了显示数据,我使用以下工作代码:

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);

现在允许 GUI 的用户修改某个列(“评论”列)。所以我为CellEndEdit 事件分配了一个eventHandler,当用户修改允许的列时,adapter.Update(data) 被调用。现在这不会执行正确的操作。

为了定义我的更新命令,我使用了以下代码:

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");

您能解释一下如何修复我的代码以自动更新数据库吗?

编辑: 添加更多源代码:

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");
        }

这是关于这个问题的全部代码。我 100% 确定调用了 adapter.Update(data) 方法(调试)。传递给adapter.Update() 方法的数据包含新数据。

【问题讨论】:

  • 当你运行这个查询时会发生什么?
  • 数据库没有任何反应...我知道(通过调试)adapter.Update(data) 方法被调用并且数据包含新值。但是数据库仍然有旧值
  • 您不能在代码末尾简单地添加GridView1.DataBind(); 吗? GridView1 被你的读者替换
  • @DiederikEEn GridView1.DataBind() 仅在 webForms 中需要,在 winForms 中不需要。所以在这种情况下没有任何区别
  • 当您使用硬编码的@coment@lot 变量直接在数据库上运行SQL 命令时会发生什么?

标签: c# mysql winforms


【解决方案1】:

您的更新声明不正确。应该是:

"UPDATE m FROM mushrooms m JOIN lots l ON m.lot_id = l.id SET m.comment = @comment WHERE l.lot = @lot"

【讨论】:

  • 不,您的 MySql 命令不是有效的 MySql 命令。 “错误 1064 (42000):您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'FROM 蘑菇 m JOINlots l ON m.lot_id = l.id SET m 附近使用的正确语法.comment = 'Test' WH' 在第 1 行"
  • 我检查了我的 MySql 命令。当我从控制台调用它时它是正确的
  • 哦!是MySQL??我认为它的 T-Sql (Sql Server)。
  • 是的,我在最初的帖子中说明了这一点
  • 您不需要在参数周围加上引号 :)
【解决方案2】:

您是否忘记执行warenlagerMySqlDataAdapter.UpdateCommand? 您只是设置命令和参数,而不是执行它。

我看到的是你在更新信息时调用了更新,但是你的更新命令没有加载。 更新行时只需调用updateWarenlagerView,但在哪里调用initialzeFields

还是我缺少代码?

【讨论】:

  • 否,因为我添加了一个调用 adapter.Update() 的事件处理程序(请参阅完整代码)
  • private void updateWarenlagerView(object sender, EventArgs e) { warenlagerMySqlDataAdapter.Update(warenlagerData); }第四行代码
【解决方案3】:

请尝试这个更新查询它的工作原理。

UPDATE mushrooms 
SET comment = @comment
WHERE 
l_id=(select id from l where lot=@lot)

【讨论】:

  • 您应该尝试使用联接而不是子查询。这是更好的做法。
  • 这个命令相当于我的查询,没有任何区别
【解决方案4】:

尝试将您的更新代码从CellEndEdit 事件移动到CellValueChanged 事件,看看是否可行。

【讨论】:

  • 谢谢,但这并没有帮助...我知道调用了 CellEndEdit 事件。我多次验证了这一点
  • 也许查看在 MySQL 中运行的实际查询,以确保您使用的 datasource 包含正确的更新注释字段
【解决方案5】:

试试这个例子:

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());

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2016-10-20
    • 2012-04-03
    相关资源
    最近更新 更多