Состояния и версии строк
ADO.NET управляет строками таблиц с помощью состояний и версий строк. Состояние строки указывает на статус строки, а версии строк хранят значения изменения строки, включая текущее, исходное и применяемое по умолчанию значения. Например, после внесения изменения в столбец строки эта строка будет иметь состояние Modified и две версии: Current, содержащую текущие значения, и Original, содержащую значения этой строки до изменения столбца.
Каждый объект DataRow имеет свойство RowState, которое отображает текущее состояние строки. В следующей таблице кратко описано каждое из значений перечисления RowState.
Значение перечисления RowState |
Описание |
---|---|
Не было выполнено никаких изменений с момента последнего вызова метода AcceptChanges или с момента создания строки методом DataAdapter.Fill. |
|
Строка добавлена к таблице, но метод AcceptChanges не вызывался. |
|
Изменены некоторые элементы строки. |
|
Строка удалена из таблицы, но метод AcceptChanges не вызывался. |
|
Строка не принадлежит ни к одной коллекции 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 |
Описание |
---|---|
Текущие значения строки. Эта версия не существует для строк, у которых RowState равно Deleted. |
|
Версия по умолчанию для конкретной строки. Версия по умолчанию для строки Added, Modified и Unchanged представляет собой Current. Версия по умолчанию для строки Deleted — Original. Версия по умолчанию для строки Detached — Proposed. |
|
Исходные значения строки. Эта версия не существует для строк, у которых RowState равно Added. |
|
Предложенные значения строки. Эта версия строки существует в течение операции изменения строки или для строки, не содержащейся в коллекции 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();
}