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


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

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

Каждый DataRow объект имеет 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 Текущие значения строки. Эта версия строки не существует для строк с RowStateDeleted.
Default Версия строки по умолчанию для определенной строки. Версия строки по умолчанию для Added, Modified или Deleted строки — Current. Версия строки по умолчанию для Detached — это Proposed.
Original Исходные значения строки. Эта версия строки не существует для строк с RowStateAdded.
Proposed Предлагаемые значения для строки. Эта версия строки существует во время операции редактирования строки или для строки, которая не является частью DataRowCollection.

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

В следующем примере кода отображаются значения во всех удаленных строках таблицы. 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();  
}  

См. также