Состояния и версии строкRow States and Row Versions

ADO.NET управляет строками таблиц с помощью состояний и версий строк.ADO.NET manages rows in tables using row states and versions. Состояние строки указывает на статус строки, а версии строк хранят значения изменения строки, включая текущее, исходное и применяемое по умолчанию значения.A row state indicates the status of a row; row versions maintain the values stored in a row as it is modified, including current, original, and default values. Например, после внесения изменения в столбец строки эта строка будет иметь состояние Modified и две версии: Current, содержащую текущие значения, и Original, содержащую значения этой строки до изменения столбца.For example, after you have made a modification to a column in a row, the row will have a row state of Modified, and two row versions: Current, which contains the current row values, and Original, which contains the row values before the column was modified.

Каждый объект DataRow имеет свойство RowState, которое отображает текущее состояние строки.Each DataRow object has a RowState property that you can examine to determine the current state of the row. В следующей таблице кратко описано каждое из значений перечисления RowState.The following table gives a brief description of each RowState enumeration value.

Значение перечисления RowStateRowState value ОписаниеDescription
Unchanged Не было выполнено никаких изменений с момента последнего вызова метода AcceptChanges или с момента создания строки методом DataAdapter.Fill.No changes have been made since the last call to AcceptChanges or since the row was created by DataAdapter.Fill.
Added Строка добавлена к таблице, но метод AcceptChanges не вызывался.The row has been added to the table, but AcceptChanges has not been called.
Modified Изменены некоторые элементы строки.Some element of the row has been changed.
Deleted Строка удалена из таблицы, но метод AcceptChanges не вызывался.The row has been deleted from a table, and AcceptChanges has not been called.
Detached Строка не принадлежит ни к одной коллекции DataRowCollection.The row is not part of any DataRowCollection. Свойство RowState только что созданной строки имеет значение Detached.The RowState of a newly created row is set to Detached. После добавления новой строки DataRow к коллекции DataRowCollection с помощью вызова метода Add свойству RowState присваивается значение Added.After the new DataRow is added to the DataRowCollection by calling the Add method, the value of the RowState property is set to Added.

Значение Detached также присваивается строке, удаленной из DataRowCollection с помощью метода Remove или путем последовательного вызова методов Delete и AcceptChanges.Detached is also set for a row that has been removed from a DataRowCollection using the Remove method, or by the Delete method followed by the AcceptChanges method.

Если метод AcceptChanges вызывается для DataSet, DataTable или DataRow, удаляются все строки со значением состояния Deleted.When AcceptChanges is called on a DataSet, DataTable , or DataRow, all rows with a row state of Deleted are removed. Оставшимся строкам присваивается состояние Unchanged, а значения в версии строки Original перезаписываются значениями версии строки Current.The remaining rows are given a row state of Unchanged, and the values in the Original row version are overwritten with the Current row version values. Если вызывается метод RejectChanges, удаляются все строки со значением состояния Added.When RejectChanges is called, all rows with a row state of Added are removed. Оставшимся строкам присваивается состояние Unchanged, а значения в версии строки Current перезаписываются значениями версии строки Original.The remaining rows are given a row state of Unchanged, and the values in the Current row version are overwritten with the Original row version values.

Можно просматривать разные версии строки, передавая параметр DataRowVersion со ссылкой на столбец, как показано в следующем примере.You can view the different row versions of a row by passing a DataRowVersion parameter with the column reference, as shown in the following example.

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.The following table gives a brief description of each DataRowVersion enumeration value.

Значение DataRowVersionDataRowVersion value ОписаниеDescription
Current Текущие значения строки.The current values for the row. Эта версия не существует для строк, у которых RowState равно Deleted.This row version does not exist for rows with a RowState of Deleted.
Default Версия по умолчанию для конкретной строки.The default row version for a particular row. Версия по умолчанию для строки Added, Modified и Deleted представляет собой Current.The default row version for an Added, Modified, or Deleted row is Current. Версия по умолчанию для строки Detached - Proposed.The default row version for a Detached row is Proposed.
Original Исходные значения строки.The original values for the row. Эта версия не существует для строк, у которых RowState равно Added.This row version does not exist for rows with a RowState of Added.
Proposed Предложенные значения строки.The proposed values for the row. Эта версия строки существует в течение операции изменения строки или для строки, не содержащейся в коллекции DataRowCollection.This row version exists during an edit operation on a row, or for a row that is not part of a DataRowCollection.

Можно проверить, имеет ли DataRow конкретную версию строки, вызвав метод HasVersion и передав ему DataRowVersion в качестве аргумента.You can test whether a DataRow has a particular row version by calling the HasVersion method and passing a DataRowVersion as an argument. Например, DataRow.HasVersion(DataRowVersion.Original) возвратит значение false для только что добавленных строк перед тем, как был вызван метод AcceptChanges.For example, DataRow.HasVersion(DataRowVersion.Original) will return false for newly added rows before AcceptChanges has been called.

В следующем примере кода показаны значения во всех удаленных строках таблицы.The following code example displays the values in all the deleted rows of a table. Строки Deleted не имеют версии строки Current, поэтому для доступа к значениям столбцов необходимо передать аргумент DataRowVersion.Original.Deleted rows do not have a Current row version, so you must pass DataRowVersion.Original when accessing the column values.

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();  
}  

См. такжеSee also