Автоматическое обновление значений в базе данных из DataGridView

В настоящее время я работаю над проектом с использованием MySql в сочетании с С#. Данные для 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 разрешено изменять определенный столбец (столбец "комментарий" ). Поэтому я назначил eventHandler событию CellEndEdit, и когда пользователь изменил разрешенный столбец, вызывается adapter.Update(data). Теперь это не выполняет правильное действие.

Чтобы определить мою команду update, я использовал следующий код:

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

Не могли бы вы объяснить мне, как я исправляю свой код для автоматического обновления базы данных?

EDIT: добавлен дополнительный исходный код:

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(), содержат новые данные.

Ответ 1

Ваше выражение об обновлении неверно. Это должно быть:

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

Ответ 2

Попробуйте выполнить этот запрос обновления.

UPDATE mushrooms 
SET comment = @comment
WHERE 
l_id=(select id from l where [email protected])

Ответ 3

Забыл ли вы выполнить warenlagerMySqlDataAdapter.UpdateCommand? Вы просто устанавливаете команду и параметры, но не выполняете ее.

Я вижу, что вы вызываете обновление, когда информация обновляется, но ваша команда обновления не загружается. Вы просто вызываете updateWarenlagerView при обновлении строки, но где вы вызываете initialzeFields?

Или мне не хватает кода?

Ответ 4

Попробуйте переместить код обновления из события CellEndEdit в событие CellValueChanged и посмотреть, работает ли это.