Estados de fila y versiones de fila
ADO .NET administra las filas de las tablas mediante estados de fila y versiones de fila. Un estado de fila indica el estado de la fila. Las versiones de fila mantienen los valores almacenados en una fila mientras se está modificando, con los valores actual, original y predeterminado. Por ejemplo, después de hacer un cambio en una columna de una fila, dicha fila tendrá un estado de fila de Modified y habrá dos versiones de fila: Current, con los valores de fila actuales, y Original, con los valores de fila anteriores a la modificación de la columna.
Cada objeto DataRow tiene una propiedad RowState que se puede examinar para determinar el estado actual de la fila. En la tabla siguiente se describen brevemente los valores de la enumeración RowState.
RowState | Descripción |
---|---|
Unchanged | No se han hecho cambios desde la última llamada a AcceptChanges o desde que DataAdapter.Fill creó la fila. |
Added | Se ha agregado la fila a la tabla, pero no se ha llamado a AcceptChanges. |
Modified | Se ha cambiado algún elemento de la tabla. |
Deleted | Se ha eliminado la fila de una tabla y no se ha llamado a AcceptChanges. |
Detached | Se ha establecido Detached para una fila que se ha creado, pero no forma parte de ninguna DataRowCollection. El RowState de una fila recién creada se establece en Detached. Una vez que se ha agregado la nueva DataRow a la DataRowCollection llamando al método Add, el valor de la propiedad RowState se establece en Added.
También se ha establecido Detached para una fila que se ha quitado de una DataRowCollection con el método Remove, o mediante el método Delete seguido del método AcceptChanges. |
Cuando se llama a AcceptChanges en DataSet, DataTable o DataRow, se quitan todas las filas con el estado de fila Deleted. Las filas que quedan reciben el estado de fila Unchanged y los valores de la versión de fila Original se sobrescriben con los valores de la versión de fila Current. Si se llama a RejectChanges, se quitan todas las filas con el estado de fila Added. Las filas que quedan reciben el estado de fila Unchanged y los valores de la versión de fila Current se sobrescriben con los valores de la versión de fila Original.
Las distintas versiones de una fila se pueden ver pasando un parámetro DataRowVersion con la referencia de la columna, como se muestra en el ejemplo siguiente.
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();
En la tabla siguiente se describen brevemente los valores de la enumeración DataRowVersion.
DataRowVersion | Descripción |
---|---|
Current | Valores actuales de la fila. Esta versión de fila no está disponible para filas con el RowState de Deleted. |
Default | Ésta es la versión de fila predeterminada para una fila determinada. La versión de fila predeterminada para una fila Added, Modified, o Unchanged es Current. La versión de fila predeterminada para una fila Deleted es Original. La versión de fila predeterminada para una fila Detached es Proposed. |
Original | Valores originales de la fila. Esta versión de fila no está disponible para filas con el RowState de Added. |
Proposed | Valores propuestos para la fila. Esta versión de fila existe mientras dura una operación de edición en una fila, o para una fila que no es parte de una DataRowCollection. |
Se puede comprobar si una DataRow tiene una versión de fila concreta llamando al método HasVersion y pasando una DataRowVersion como argumento. Por ejemplo, DataRow.HasVersion(DataRowVersion.Original)
devolverá false para las filas recién agregadas antes de que se llame a AcceptChanges.
El código siguiente muestra los valores de todas las filas eliminadas de una tabla. Las filas Deleted no tienen la versión de fila Current, por lo que se debe pasar DataRowVersion.Original cuando se tenga acceso a los valores de la columna.
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();
}
Vea también
Manipular datos en DataTable | DataRowCollection (Clase) | DataRow.RowState (Propiedad) | DataRowVersion (Enumeración) | DataViewRowState (Enumeración)