Estados de linha e versões de linhaRow States and Row Versions

O ADO.NET gerencia linhas nas tabelas usando estados de linha e versões.ADO.NET manages rows in tables using row states and versions. Um estado de linha indica o status de uma linha; as versões de linha mantêm os valores armazenados em uma linha à medida que são modificados, incluindo os valores atuais, originais e padrão.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. Por exemplo, depois que você tiver feito uma alteração em uma coluna em uma linha, a linha terá um estado de linha de Modified e duas versões de linha: Current, que contém os valores atuais de linha e Original, que contém os valores de linha antes que a coluna foi modificada.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.

Cada objeto DataRow tem uma propriedade RowState que você pode examinar para determinar o estado atual da linha.Each DataRow object has a RowState property that you can examine to determine the current state of the row. A tabela a seguir dá a você uma breve descrição de cada valor de enumeração RowState.The following table gives a brief description of each RowState enumeration value.

Valor de RowStateRowState value DescriçãoDescription
Unchanged Nenhuma alteração foi feita desde a última chamada para AcceptChanges ou desde que a linha foi criada por DataAdapter.Fill.No changes have been made since the last call to AcceptChanges or since the row was created by DataAdapter.Fill.
Added A linha foi adicionada à tabela, mas AcceptChanges não foi chamado.The row has been added to the table, but AcceptChanges has not been called.
Modified Algum elemento da linha foi alterado.Some element of the row has been changed.
Deleted A linha foi excluída da tabela e AcceptChanges não foi chamado.The row has been deleted from a table, and AcceptChanges has not been called.
Detached A linha não faz parte de nenhum DataRowCollection.The row is not part of any DataRowCollection. O RowState de uma linha recém-criada é definido como Detached.The RowState of a newly created row is set to Detached. Após o novo DataRow ser adicionado ao DataRowCollection chamando o método Add, o valor da propriedade RowState é definido como 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 também são definidos para uma linha que foi removida de um DataRowCollection usando o método Remove ou o método Delete seguido pelo método 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.

Quando AcceptChanges tiver sido chamado em um DataSet, DataTable ou DataRow, todas as linhas com um estado de linha de Deleted serão removidas.When AcceptChanges is called on a DataSet, DataTable , or DataRow, all rows with a row state of Deleted are removed. As linhas restantes recebem um estado de linha de Unchanged e os valores na versão de linha Original são substituídos pelos valores da versão de linha 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. Quando RejectChanges tiver sido chamado, todas as linhas com um estado de Added serão removidas.When RejectChanges is called, all rows with a row state of Added are removed. As linhas restantes recebem um estado de linha de Unchanged e os valores na versão de linha Current são substituídos pelos valores da versão de linha 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.

Você pode exibir as versões de linha diferentes de uma linha passando um parâmetro DataRowVersion com a referência de coluna, conforme mostrado no exemplo a seguir.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();  

A tabela a seguir dá a você uma breve descrição de cada valor de enumeração DataRowVersion.The following table gives a brief description of each DataRowVersion enumeration value.

Valor de DataRowVersionDataRowVersion value DescriçãoDescription
Current Os valores atuais para a linha.The current values for the row. Esta versão de linha não existe para linhas com um RowState de Deleted.This row version does not exist for rows with a RowState of Deleted.
Default A versão de linha padrão para uma linha específica.The default row version for a particular row. A versão de linha padrão para uma linha Added, Modified ou Deleted é Current.The default row version for an Added, Modified, or Deleted row is Current. A versão de linha padrão para uma linha Detached é Proposed.The default row version for a Detached row is Proposed.
Original Os valores originais para a linha.The original values for the row. Esta versão de linha não existe para linhas com um RowState de Added.This row version does not exist for rows with a RowState of Added.
Proposed Os valores propostos para a linha.The proposed values for the row. Esta versão de linha existe durante uma operação de edição em uma linha ou para uma linha que não faz parte de um DataRowCollection.This row version exists during an edit operation on a row, or for a row that is not part of a DataRowCollection.

Você pode testar se um DataRow tem uma versão de linha específica chamando o método HasVersion e passando DataRowVersion como argumento.You can test whether a DataRow has a particular row version by calling the HasVersion method and passing a DataRowVersion as an argument. Por exemplo, DataRow.HasVersion(DataRowVersion.Original) retornará false para linhas recém-adicionadas antes que AcceptChanges tenha sido chamado.For example, DataRow.HasVersion(DataRowVersion.Original) will return false for newly added rows before AcceptChanges has been called.

O exemplo de código a seguir exibe os valores em todas as linhas excluídas de uma tabela.The following code example displays the values in all the deleted rows of a table. As linhas Deleted não têm uma versão de linha Current; portanto, você deve passar DataRowVersion.Original ao acessar os valores de coluna.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();  
}  

Consulte tambémSee also