В чем разница между RowState.Added и DataRowVersion.Original

У меня есть функция с 3 условиями:

  1. Если DataRow rowstate == Added
  2. Если !DataRow HasVersion(DataRowVersion.Original)
  3. Если DataRow rowstate == modified

Моя проблема со вторым, кто-нибудь может пролить свет на это?Чем он отличается от первого условия?

1 ответ

Решение

объяснение

  1. DataRow имеет RowState " Добавлено ", когда он вновь добавляется в таблицу после вызова AcceptChanges() RowState будет установлен в " Без изменений "
  2. DataRow имеет DataRowVersion "Оригинал", когда он содержит свои исходные значения. При звонке AcceptChanges() для DataRow или DataTable для DataRowVersion будет установлено значение "Исходный". Можно сказать, что оригинал означает, что все изменения были приняты.
  3. DataRow имеет RowState "Modified" после того, как он был отредактирован.

Пример программы

Я создал небольшой пример программы, которая показывает изменения в действии, чтобы прояснить различия.

class Program {
    static void Main(string[] args) {
        var table = new DataTable("MyTable");
        table.Columns.Add(new DataColumn("MyColumn"));
        var row = table.NewRow();
        Console.WriteLine($"Rowstate: {row.RowState}"); //Prints Detached

        table.Rows.Add(row);
        Console.WriteLine($"Rowstate: {row.RowState}"); //Prints Added

        table.AcceptChanges();
        Console.WriteLine($"Rowstate: {row.RowState}"); //Prints Unchanged

        row.BeginEdit();
        row[0] = "NewValue";
        row.EndEdit();
        Console.WriteLine($"Rowstate: {row.RowState}"); //Prints Modified

        if (row.HasVersion(DataRowVersion.Current)) { // Does the row contain uncommited values?
            Console.WriteLine($"DataRowVersion: {DataRowVersion.Current}"); //Prints Current
        }

        table.AcceptChanges(); //Commit all DataRowChanges
        if (row.HasVersion(DataRowVersion.Original)) {
            Console.WriteLine($"DataRowVersion: {DataRowVersion.Original}"); //Prints Current
        }

        Console.ReadLine();
    }
}

Дальнейшее чтение

Документация msdn о DataRowStates на самом деле довольно хорошо объяснена. Он предоставляет краткое объяснение каждого состояния, а также пример кода. То же самое для DataRowVersions. Вы должны обязательно взглянуть на эти 2 статьи.

DataRowVersion

Цитата из связанной статьи MSDN:

После вызова метода BeginEdit объекта DataRow при изменении значения становятся доступными значения Current и Proposed.

После вызова метода CancelEdit объекта DataRow предложенное значение удаляется.

После вызова метода EndEdit объекта DataRow предложенное значение становится текущим значением.

После вызова метода AcceptChanges объекта DataRow значение Original становится идентичным значению Current.

После вызова метода AcceptChanges объекта DataTable значение Original становится идентичным значению Current.

После вызова метода RejectChanges объекта DataRow предложенное значение отбрасывается, и версия становится текущей.

Состояние строки (добавлено, удалено..) Версия строки (исходная, текущая, предлагаемая)

Метод обновления, использующий версию строки, чтобы решить, какие изменения применить к базе данных. Если мы вызовем метод AcceptChanges в адаптере таблицы перед вызовом метода обновления: текущая версия будет исходной версией, поэтому вы не должны вызывать метод ACCEPTCHANGES перед вызовом метода обновления

Другие вопросы по тегам