Editar datos en conjuntos de datos mediante .NET Framework

Nota:

Los conjuntos de datos y las clases relacionadas son tecnologías heredadas de .NET Framework de principios de la década de 2000 que permiten a las aplicaciones trabajar con datos en memoria mientras están desconectadas de la base de datos. Son especialmente útiles para las aplicaciones que permiten a los usuarios modificar los datos y conservar los cambios en la base de datos. Aunque los conjuntos de datos han demostrado ser una tecnología de gran éxito, se recomienda que las nuevas aplicaciones de .NET usen Entity Framework Core. Entity Framework proporciona una manera más natural de trabajar con datos tabulares como modelos de objetos y tiene una interfaz de programación más sencilla.

Los datos de las tablas de datos se editan de forma muy similar a los datos de una tabla de cualquier base de datos. El proceso puede incluir la inserción, actualización y eliminación de registros en la tabla. En un formulario enlazado a datos, puede especificar qué campos son editables por el usuario. En esos casos, la infraestructura de enlace de datos controla todo el seguimiento de cambios para que los cambios se puedan devolver a la base de datos más adelante. Si realiza modificaciones en los datos mediante programación y tiene previsto devolver esos cambios a la base de datos, debe usar los objetos y métodos que realizan el seguimiento de cambios automáticamente.

Además de cambiar los datos reales, también puede consultar un DataTable para devolver filas específicas de datos. Por ejemplo, puede consultar filas individuales, versiones específicas de filas (originales y propuestas), filas que han cambiado o filas que tienen errores.

Para editar filas de un conjunto de datos

Para editar una fila existente en un DataTable, debe localizar el objeto DataRow que desea editar y, a continuación, asignar los valores actualizados a las columnas deseadas.

Si no conoce el índice de la fila que desea editar, use el método FindBy para buscar por la clave principal:

NorthwindDataSet.CustomersRow customersRow = 
    northwindDataSet1.Customers.FindByCustomerID("ALFKI");

customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";

Si conoce el índice de fila, puede acceder a las filas y editarla de la siguiente manera:

northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";

Para insertar filas nuevas en un conjunto de datos

Las aplicaciones que usan controles enlazados a datos suelen agregar nuevos registros a través del botón Agregar nuevo en un control BindingNavigator.

Para agregar manualmente nuevos registros a un conjunto de datos, cree una nueva fila de datos llamando al método en DataTable. A continuación, agregue la fila a la colección DataRow (Rows) de DataTable:

NorthwindDataSet.CustomersRow newCustomersRow = 
    northwindDataSet1.Customers.NewCustomersRow();

newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

Para conservar la información que el conjunto de datos necesita para enviar actualizaciones al origen de datos, use el método Delete para quitar filas de una tabla de datos. Por ejemplo, si la aplicación usa un tableAdapter (o DataAdapter), el método Update de TableAdapter elimina las filas de la base de datos que tienen un RowState de Deleted.

Si la aplicación no necesita devolver actualizaciones a un origen de datos, es posible quitar registros accediendo directamente a la colección de filas de datos (Remove).

Para eliminar registros de una tabla de datos

  • Llame al método Delete de un DataRow.

    Este método no quita físicamente el registro. En su lugar, marca el registro para su eliminación.

    Nota

    Si obtiene la propiedad count de un DataRowCollection, el recuento resultante incluye los registros que han sido marcados para su eliminación. Para obtener un recuento preciso de los registros que no están marcados para su eliminación, puede recorrer en bucle la colección que examina la propiedad RowState de cada registro. (Los registros marcados para su eliminación tienen un RowState de Deleted). Como alternativa, puede crear una vista de datos de un conjunto de datos que filtre según el estado de fila y obtenga la propiedad count desde allí.

En el ejemplo siguiente se muestra cómo llamar al método Delete para marcar la primera fila de la tabla Customers como eliminada:

northwindDataSet1.Customers.Rows[0].Delete();

Determinar si hay filas modificadas

Cuando se realizan cambios en los registros de un conjunto de datos, se almacena información sobre dichos cambios hasta que los confirme Los cambios se confirman al llamar al método AcceptChanges de un conjunto de datos o una tabla de datos, o cuando se llama al método Update de un TableAdapter o un adaptador de datos.

Se realiza un seguimiento de los cambios de dos maneras en cada fila de datos:

  • Cada fila de datos contiene información relacionada con su RowState (por ejemplo, Added, Modified, Deletedo Unchanged).

  • Cada fila de datos modificada contiene varias versiones de esa fila (DataRowVersion), la versión original (antes de los cambios) y la versión actual (después de los cambios). Durante el período en el que un cambio está pendiente (el tiempo en el que puede responder al evento RowChanging), una tercera versión -la versión propuesta- también está disponible.

El método HasChanges de un conjunto de datos devuelve true si se han realizado modificaciones en el mismo. Después de determinar que las filas modificadas existen, puede llamar al método GetChanges de un control DataSet o DataTable para devolver un conjunto de filas cambiadas.

Para determinar si se han realizado cambios en las filas

  • Llame al método HasChanges de un conjunto de datos para comprobar si hay filas modificadas.

En el ejemplo siguiente, se muestra cómo comprobar el valor devuelto del método HasChanges para detectar si hay filas modificadas en un conjunto de datos denominado NorthwindDataset1:

if (northwindDataSet1.HasChanges()) 
{
    // Changed rows were detected, add appropriate code.
}
else
{
    // No changed rows were detected, add appropriate code.
}

Determinar el tipo de cambios

También puede comprobar qué tipo de cambios se realizaron en un conjunto de datos pasando un valor de la enumeración DataRowState al método HasChanges.

Para determinar el tipo de cambios realizados en una fila

En el ejemplo siguiente se muestra cómo comprobar un conjunto de datos denominado NorthwindDataset1 para determinar si se han agregado filas nuevas a él:

if (northwindDataSet1.HasChanges(DataRowState.Added)) 
{
    // New rows have been added to the dataset, add appropriate code.
}
else
{
    // No new rows have been added to the dataset, add appropriate code.
}

Para buscar filas que tienen errores

Al trabajar con columnas individuales y filas de datos, es posible que encuentre errores. Puede comprobar la propiedad HasErrors para determinar si existen errores en DataSet, DataTable o DataRow.

  1. Compruebe la propiedad HasErrors para ver si hay algún error en el conjunto de datos.

  2. Si la propiedad HasErrors es true, itere a través de las colecciones de tablas, y luego a través de las filas, para encontrar la fila con el error.

private void FindErrors() 
{
    if (dataSet1.HasErrors)
    {
        foreach (DataTable table in dataSet1.Tables)
        {
            if (table.HasErrors)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row.HasErrors)
                    {
                        // Process error here.
                    }
                }
            }
        }
    }
}