Состояния и версии строк
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();
}