Поделиться через


Состояния и версии строк

ADO.NET управляет строками таблиц с помощью состояний и версий строк. Состояние строки указывает на статус строки, а версии строк хранят значения изменения строки, включая текущее, исходное и применяемое по умолчанию значения. Например, после внесения изменения в столбец строки эта строка будет иметь состояние Modified и две версии: Current, содержащую текущие значения, и Original, содержащую значения этой строки до изменения столбца.

Каждый объект DataRow имеет свойство RowState, которое отображает текущее состояние строки. В следующей таблице кратко описано каждое из значений перечисления RowState.

Значение перечисления RowState

Описание

Unchanged

Не было выполнено никаких изменений с момента последнего вызова метода AcceptChanges или с момента создания строки методом DataAdapter.Fill.

Added

Строка добавлена к таблице, но метод AcceptChanges не вызывался.

Modified

Изменены некоторые элементы строки.

Deleted

Строка удалена из таблицы, но метод AcceptChanges не вызывался.

Detached

Строка не принадлежит ни к одной коллекции DataRowCollection. Свойство RowState только что созданной строки имеет значение Detached. После добавления новой строки DataRow к коллекции DataRowCollection с помощью вызова метода Add свойству RowState присваивается значение Added.

Значение Detached также присваивается строке, удаленной из DataRowCollection с помощью метода Remove или путем последовательного вызова методов Delete и AcceptChanges.

Если метод AcceptChanges вызывается для DataSet, DataTable или DataRow, удаляются все строки со значением состояния Deleted. Оставшимся строкам присваивается состояние Unchanged, а значения в версии строки Original перезаписываются значениями версии строки Current. Если вызывается метод RejectChanges, удаляются все строки со значением состояния Added. Оставшимся строкам присваивается состояние Unchanged, а значения в версии строки Current перезаписываются значениями версии строки Original.

Можно просматривать разные версии строки, передавая параметр DataRowVersion со ссылкой на столбец, как показано в следующем примере.

Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();

В следующей таблице кратко описано каждое из значений перечисления DataRowVersion.

Значение DataRowVersion

Описание

Current

Текущие значения строки. Эта версия не существует для строк, у которых RowState равно Deleted.

Default

Версия по умолчанию для конкретной строки. Версия по умолчанию для строки Added, Modified и Unchanged представляет собой Current. Версия по умолчанию для строки Deleted — Original. Версия по умолчанию для строки Detached — Proposed.

Original

Исходные значения строки. Эта версия не существует для строк, у которых RowState равно Added.

Proposed

Предложенные значения строки. Эта версия строки существует в течение операции изменения строки или для строки, не содержащейся в коллекции DataRowCollection.

Можно проверить, имеет ли DataRow конкретную версию строки, вызвав метод HasVersion и передав ему DataRowVersion в качестве аргумента. Например, DataRow.HasVersion(DataRowVersion.Original) возвратит значение false для только что добавленных строк перед тем, как был вызван метод AcceptChanges.

В следующем примере кода показаны значения во всех удаленных строках таблицы. Строки Deleted не имеют версии строки Current, поэтому для доступа к значениям столбцов необходимо передать аргумент DataRowVersion.Original.

Dim catTable As DataTable = catDS.Tables("Categories")

Dim delRows() As DataRow = catTable.Select(Nothing, Nothing, DataViewRowState.Deleted)

Console.WriteLine("Deleted rows:" & vbCrLf)

Dim catCol As DataColumn
Dim delRow As DataRow

For Each catCol In catTable.Columns
  Console.Write(catCol.ColumnName & vbTab)
Next
Console.WriteLine()

For Each delRow In delRows
  For Each catCol In catTable.Columns
    Console.Write(delRow(catCol, DataRowVersion.Original) & vbTab)
  Next
  Console.WriteLine()
Next
DataTable catTable = catDS.Tables["Categories"];

DataRow[] delRows = catTable.Select(null, null, DataViewRowState.Deleted);

Console.WriteLine("Deleted rows:\n");

foreach (DataColumn catCol in catTable.Columns)
  Console.Write(catCol.ColumnName + "\t");
Console.WriteLine();

foreach (DataRow delRow in delRows)
{
  foreach (DataColumn catCol in catTable.Columns)
    Console.Write(delRow[catCol, DataRowVersion.Original] + "\t");
  Console.WriteLine();
}

См. также

Другие ресурсы

Обработка данных в DataTable

Объекты DataSet, DataTable и DataView (ADO.NET)

Объекты DataAdapter и DataReader (ADO.NET)