Partilhar via


Estados de linha e versões de linha

ADO.NET gerencia linhas em tabelas usando estados e versões de linha. 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 ela é modificada, incluindo valores atuais, originais e padrão. Por exemplo, depois de fazer uma modificação em uma coluna em uma linha, a linha terá um estado de linha de , e duas versões de linha: Current, que contém os valores de linha atuais e Original, que contém os valores de linha antes da Modifiedcoluna ser modificada.

Cada DataRow objeto tem uma RowState propriedade que você pode examinar para determinar o estado atual da linha. A tabela a seguir fornece uma breve descrição de cada RowState valor de enumeração.

Valor RowState Description
Unchanged Nenhuma alteração foi feita desde a última chamada para AcceptChanges ou desde que a linha foi criada pela DataAdapter.Fill.
Added A linha foi adicionada à tabela, mas AcceptChanges não foi chamada.
Modified Alguns elementos da linha foram alterados.
Deleted A linha foi excluída de uma tabela e AcceptChanges não foi chamada.
Detached A linha não faz parte de nenhum DataRowCollectionarquivo . O RowState de uma linha recém-criada é definido como Detached. Depois que o novo DataRow é adicionado ao DataRowCollection chamando o Add método, o valor da RowState propriedade é definido como Added.

Detached também é definido para uma linha que foi removida de um DataRowCollection usando o Remove método ou pelo Delete método seguido pelo AcceptChanges método.

Quando AcceptChanges é chamado em um DataSet, DataTable ou DataRow, todas as linhas com um estado de linha de Deleted são removidas. As linhas restantes recebem um estado de linha de , e os valores na versão da Original linha são substituídos Unchangedpelos valores da versão da Current linha. Quando RejectChanges é chamado, todas as linhas com um estado de linha de Added são removidas. As linhas restantes recebem um estado de linha de , e os valores na versão da Current linha são substituídos Unchangedpelos valores da versão da Original linha.

Você pode exibir as diferentes versões de linha de uma linha passando um DataRowVersion parâmetro com a referência de coluna, conforme mostrado no exemplo a seguir.

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 fornece uma breve descrição de cada DataRowVersion valor de enumeração.

Valor DataRowVersion Description
Current Os valores atuais para a linha. Esta versão de linha não existe para linhas com um RowState de Deleted.
Default A versão de linha padrão para uma linha específica. A versão de linha padrão para um Added, Modifiedou Deleted linha é Current. A versão de linha padrão para uma Detached linha é Proposed.
Original Os valores originais da linha. Esta versão de linha não existe para linhas com um RowState de Added.
Proposed Os valores propostos para a linha. 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 DataRowCollectionarquivo .

Você pode testar se uma DataRow tem uma versão de linha específica chamando o HasVersion método e passando a DataRowVersion como um argumento. Por exemplo, DataRow.HasVersion(DataRowVersion.Original) retornará false para linhas recém-adicionadas antes AcceptChanges de ter sido chamado.

O exemplo de código a seguir exibe os valores em todas as linhas excluídas de uma tabela. Deleted As linhas não têm uma Current versão de linha, portanto, você deve passar DataRowVersion.Original ao acessar os valores da coluna.

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ém