Stati delle righe e versioni delle righe

In ADO.NET le righe delle tabelle vengono gestite tramite gli stati e le versioni delle righe. Lo stato della riga indica lo stato di una particolare riga. Le versioni delle righe consentono di mantenere i valori memorizzati in una riga durante le modifiche. Vengono conservati anche i valori correnti, originali e predefiniti. Dopo aver ad esempio apportato una modifica a una colonna in una riga, lo stato della riga di tale riga sarà Modified e saranno disponibili due versioni della riga: Current, in cui sono contenuti i valori di riga correnti, e Original, in cui sono contenuti i valori di riga precedenti alla modifica della colonna.

A ogni oggetto DataRow è assegnata una proprietà RowState, il cui esame consente di determinare lo stato corrente della riga. Nella tabella seguente viene fornita una breve descrizione di ogni valore di enumerazione di RowState.

RowState Descrizione
Unchanged Non è stata apportata alcuna modifica rispetto all'ultima chiamata a AcceptChanges o alla creazione della riga da parte di DataAdapter.Fill.
Added La riga è stata aggiunta alla tabella, ma AcceptChanges non è stato chiamato.
Modified Alcuni elementi della riga sono stati modificati.
Deleted La riga è stata eliminata da una tabella e AcceptChanges non è stato chiamato.
Detached Il valore Detached viene impostato per una riga che è stata creata ma non fa parte di alcun DataRowCollection. Il valore RowState di una riga appena creata viene impostato su Detached. Dopo l'aggiunta del nuovo DataRow al DataRowCollection tramite la chiamata al metodo Add, il valore della proprietà RowState viene impostato su Added.

Il valore Detached viene impostato anche per una riga rimossa da un DataRowCollection mediante il metodo Remove oppure mediante il metodo Delete seguito dal metodo AcceptChanges.

Quando AcceptChanges viene chiamato in DataSet, DataTable o DataRow, tutte le righe il cui stato della riga corrisponde a Deleted vengono rimosse. Alle righe rimanenti viene assegnato lo stato Unchanged e i valori presenti nella versione della riga Original vengono sovrascritti con i valori della versione della riga Current. Quando RejectChanges viene chiamato, tutte le righe il cui stato della riga corrisponde ad Added vengono rimosse. Alle righe rimanenti viene assegnato lo stato Unchanged e i valori presenti nella versione della riga Current vengono sovrascritti con i valori della versione della riga Original.

È possibile visualizzare le diverse versioni della riga di una riga passando un parametro DataRowVersion contenente il riferimento alla colonna, come mostrato nell'esempio seguente.

Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()
[C#]
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();

Nella tabella che segue viene fornita una breve descrizione di ogni valore di enumerazione di DataRowVersion.

DataRowVersion Descrizione
Current Valori correnti della riga. Questa versione della riga non è disponibile per le righe in cui il valore di RowState è Deleted.
Default Versione della riga predefinita per una particolare riga. La versione della riga predefinita per una riga Added, Modified o Unchanged è Current. La versione della riga predefinita per una riga Deleted è Original e per una riga Detached è Proposed.
Original Valori originali della riga. Questa versione della riga non è disponibile per righe il cui valore per RowState corrisponde ad Added.
Proposed Valori proposti per la riga. Questa versione della riga è disponibile durante un'operazione di modifica di una riga o per una riga che non fa parte di un DataRowCollection.

Per verificare se a DataRow è associata una particolare versione della riga, è possibile chiamare il metodo HasVersion e passare DataRowVersion come argomento. DataRow.HasVersion(DataRowVersion.Original), ad esempio, restituirà false per le nuove righe aggiunte prima della chiamata di AcceptChanges.

Il seguente esempio di codice consente di visualizzare i valori di tutte le righe eliminate della tabella. Alle righe Deleted non è associata la versione di riga Current. Quando si accede ai valori delle colonne, sarà quindi necessario passare 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
[C#]
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();
}

Vedere anche

Modifica dei dati in una DataTable | Classe DataRowCollection | Proprietà DataRow.RowState | Enumerazione DataRowVersion | Enumerazione DataViewRowState