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

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

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

Значение перечисления RowState Description
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 Description
Current Текущие значения строки. Эта версия не существует для строк, у которых RowState равно Deleted.
Default Версия по умолчанию для конкретной строки. Версия по умолчанию для строки Added, Modified и Deleted представляет собой Current. Версия по умолчанию для строки 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();  
}  

См. также