Лучший способ получить изменения в DataSet и сохранить их в базе данных - PullRequest
0 голосов
/ 09 апреля 2020

В проекте C# WinForms, который подключается к базе данных PostgreSQL с использованием инфраструктуры Npg sql, мне нужно разрешить пользователю вносить изменения в любом месте DGV, а затем по нажатию кнопки мне нужно инициировать процесс, который находит эти изменения и фиксирует их в базе данных.

В настоящее время у меня есть приведенный ниже код, который проходит через DataTable DGV, в каждом DataRow он проходит через каждый столбец и сравнивает исходное значение DataRowVersion с предлагаемым значением:

private void CheckDgvForChangedCells(DataTable dt)
{
    string strOriginalValue;
    string strEnteredValue;
    int intRowIndex;
    int intColumnIndex;

    for (intRowIndex = 0; intRowIndex <= dt.Rows.Count - 1; intRowIndex++)
    {
        for (intColumnIndex = 0; intColumnIndex <= dt.Columns.Count - 1; intColumnIndex++)
        {
            DataRow drCurrRow = dt.Rows[intRowIndex];
            strOriginalValue = drCurrRow[intColumnIndex, DataRowVersion.Original].ToString();
            strEnteredValue = drCurrRow[intColumnIndex, DataRowVersion.Proposed].ToString();

            if (strOriginalValue != strEnteredValue)
            {
                // Do something
            }
        }
    }
}

Таблица базы данных, которая заполняет DataTable, в настоящее время насчитывает чуть более 1400 строк, которые будут расти со временем, вместе с 7 столбцами, и когда я собирал это вместе, мне было интересно, если это лучше / Наиболее эффективный способ найти все измененные значения и обновить базу данных, как я нахожу каждое из них.

[ОБНОВЛЕНИЕ]

Согласно предложению Стива в комментариях, я пытался работать с DataTable.GetChanges(), но я я не вижу, как получить только столбцы в данной строке, которые изменились.

Я изменил v arious ячейки в трех разных строках и dtChanges.Rows.Count было 3, как и ожидалось, но там находится весь ряд с новыми значениями в отредактированных ячейках. Я не вижу, как использовать dtChanges для обновления базы данных только с измененными столбцами соответствующих измененных столбцов.

1 Ответ

0 голосов
/ 09 апреля 2020

Полагаю, что использование метода GetChanges из DataTable удовлетворительным образом решит вашу проблему. Этот метод возвращает DataTable только с измененными строками, и вы можете реализовать простой лог c для обновления ваших записей. Это сохранит вас для изучения всех 1400 строк и сравнения значений каждой версии, как вы делаете сейчас.

private void CheckDgvForChangedCells(DataTable dt)
{

    DataTable dtChanges = dt.GetChanges();
    foreach (DataRow row in dtChanges.Row)
    {
        switch(row.RowState)
        {
            case DataRowState.Modified:
                // TODO
                ExecuteUpdateCommand(row);
                break;
            case DataRowState.Added:
                // TODO
                ExecuteInsertCommand(row);
                break;
            case DataRowState.Deleted:
                // This is trickier. You cannot access any field in a deleted row
                // So you first need to call row.RejectChanges, get the primary key value
                // delete the row on the database, re-delete the row in the DataTable
                // TODO
                ExecuteDeleteCommand(row);
                break;
            }
        }
        // Do not forget to call AcceptChanges to set the table to a pristine initial editing state
        dt.AcceptChanges();
    }
}
...