Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
La DataSet clase y las clases relacionadas son tecnologías heredadas de .NET Framework de principios de los años 2000 que permiten a las aplicaciones trabajar con datos en memoria mientras las aplicaciones están desconectadas de la base de datos. Las tecnologías son especialmente útiles para las aplicaciones que permiten a los usuarios modificar datos y conservar los cambios de nuevo en la base de datos. Aunque los conjuntos de datos son una tecnología probada de éxito, el enfoque recomendado para las nuevas aplicaciones .NET es usar 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.
Visual Studio proporciona herramientas en tiempo de diseño para trabajar con objetos personalizados como origen de datos en la aplicación. Cuando quiera almacenar datos de una base de datos en un objeto que se enlaza a controles de interfaz de usuario, el enfoque recomendado es usar Entity Framework para generar la clase o las clases. Entity Framework genera automáticamente todo el código reutilizable de seguimiento de cambios, lo que significa que los cambios en los objetos locales se conservan automáticamente en la base de datos cuando se llama a AcceptChanges en el objeto DbSet. Para obtener más información, consulte Documentación de Entity Framework.
Sugerencia
Los enfoques para el enlace de objetos de este artículo solo se deben tener en cuenta si la aplicación ya está basada en conjuntos de datos. También puede usar estos enfoques si ya está familiarizado con los conjuntos de datos y los datos que va a procesar son tabulares y no demasiado complejos o demasiado grandes. Para obtener un ejemplo aún más sencillo, que implica cargar datos directamente en objetos mediante dataReader y actualizar manualmente la interfaz de usuario sin enlace de datos, consulte Creación de una aplicación de datos sencilla mediante ADO.NET.
Requisitos de objetos
El único requisito para que los objetos personalizados funcionen con las herramientas de diseño de datos en Visual Studio es que el objeto necesita al menos una propiedad pública.
Por lo general, los objetos personalizados no requieren interfaces, constructores ni atributos específicos para que actúen como origen de datos para una aplicación. Sin embargo, si desea arrastrar el objeto desde la ventana Orígenes de datos a una superficie de diseño para crear un control enlazado a datos y, si el objeto implementa la ITypedList interfaz o IListSource , el objeto debe tener un constructor predeterminado. De lo contrario, Visual Studio no puede crear una instancia del objeto de origen de datos y muestra un error al arrastrar el elemento a la superficie de diseño.
Ejemplos de uso de objetos personalizados como orígenes de datos
Aunque hay innumerables maneras de implementar la lógica de la aplicación al trabajar con objetos como origen de datos, para las bases de datos SQL hay algunas operaciones estándar que se pueden simplificar mediante el uso de los objetos TableAdapter generados por Visual Studio. En esta página se explica cómo implementar estos procesos estándar mediante TableAdapters. No está pensado como guía para crear los objetos personalizados. Por ejemplo, normalmente realizará las siguientes operaciones estándar independientemente de la implementación específica de los objetos o la lógica de la aplicación:
Cargar datos en objetos (normalmente desde una base de datos).
Crear una colección tipada de objetos.
Agregar objetos a y quitar objetos de una colección.
Mostrar los datos del objeto a los usuarios en un formulario.
Cambiar o editar los datos de un objeto.
Guardar datos de objetos de nuevo en la base de datos.
Carga de datos en objetos
En este ejemplo, se cargan datos en los objetos mediante TableAdapters. De forma predeterminada, TableAdapters se crea con dos tipos de métodos que capturan datos de una base de datos y rellenan tablas de datos.
El
TableAdapter.Fillmétodo rellena una tabla de datos existente con los datos devueltos.El
TableAdapter.GetDatamétodo devuelve una nueva tabla de datos rellenada con datos.
La manera más fácil de cargar los objetos personalizados con datos es llamar al TableAdapter.GetData método , recorrer en bucle la colección de filas de la tabla de datos devuelta y rellenar cada objeto con los valores de cada fila. Puede crear un GetData método que devuelva una tabla de datos rellenada para cualquier consulta agregada a TableAdapter.
Nota:
Visual Studio asigna nombres a las consultas Fill TableAdapter y GetData , de forma predeterminada, pero puede cambiar esos nombres a cualquier nombre de método válido.
En el ejemplo siguiente se muestra cómo recorrer en bucle las filas de una tabla de datos y rellenar un objeto con datos:
private void LoadCustomers()
{
NorthwindDataSet.CustomersDataTable customerData =
customersTableAdapter1.GetTop5Customers();
foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
{
Customer currentCustomer = new Customer();
currentCustomer.CustomerID = customerRow.CustomerID;
currentCustomer.CompanyName = customerRow.CompanyName;
if (customerRow.IsAddressNull() == false)
{
currentCustomer.Address = customerRow.Address;
}
if (customerRow.IsCityNull() == false)
{
currentCustomer.City = customerRow.City;
}
if (customerRow.IsContactNameNull() == false)
{
currentCustomer.ContactName = customerRow.ContactName;
}
if (customerRow.IsContactTitleNull() == false)
{
currentCustomer.ContactTitle = customerRow.ContactTitle;
}
if (customerRow.IsCountryNull() == false)
{
currentCustomer.Country = customerRow.Country;
}
if (customerRow.IsFaxNull() == false)
{
currentCustomer.Fax = customerRow.Fax;
}
if (customerRow.IsPhoneNull() == false)
{
currentCustomer.Phone = customerRow.Phone;
}
if (customerRow.IsPostalCodeNull() == false)
{
currentCustomer.PostalCode = customerRow.PostalCode;
}
if (customerRow.IsRegionNull() == false)
{
currentCustomer.Region = customerRow.Region;
}
LoadOrders(currentCustomer);
customerBindingSource.Add(currentCustomer);
}
}
Crear una colección de objetos tipados
Puede crear clases de colección para los objetos o usar las colecciones tipadas proporcionadas automáticamente por el componente BindingSource.
Al crear una clase de colección personalizada para objetos, se recomienda heredar de BindingList<T>. Esta clase genérica proporciona funcionalidad para administrar la colección, así como la capacidad de generar eventos que envían notificaciones a la infraestructura de enlace de datos en Windows Forms.
La colección generada automáticamente en BindingSource utiliza BindingList<T> para su colección con tipo. Si la aplicación no requiere funcionalidad adicional, puede mantener la colección dentro de BindingSource. Para obtener más información, vea la List propiedad de la BindingSource clase .
Nota:
Si la colección requiere funcionalidad no proporcionada por la implementación base de BindingList<T>, debe crear una colección personalizada para poder agregar a la clase según sea necesario.
El código siguiente muestra cómo crear la clase para una colección tipada de manera estricta de Order objetos:
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
// Add any additional functionality required by your collection.
}
Agregar objetos a una colección
Agregas objetos a una colección llamando al método Add de tu clase de colección personalizada o de la BindingSource.
Nota:
El método Add se proporciona automáticamente para su colección personalizada al heredar de BindingList<T>.
En el siguiente código se muestra cómo agregar objetos a la colección tipada en BindingSource:
El código siguiente muestra cómo agregar objetos a una colección con tipo que hereda de BindingList<T>:
Nota:
En este ejemplo, la Orders colección es una propiedad del Customer objeto .
Quitar objetos de una colección
Para quitar objetos de una colección, llame al método Remove o RemoveAt de su clase de colección personalizada o de BindingSource.
Nota:
Los métodos Remove y RemoveAt se proporcionan automáticamente para tu colección personalizada al heredar de BindingList<T>.
En el código siguiente se muestra cómo buscar y quitar objetos de la colección con tipo en BindingSource con el método RemoveAt:
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);
Mostrar datos de objeto a los usuarios
Para mostrar los datos en objetos a los usuarios, cree un origen de datos de objeto mediante el asistente para Configuración del Origen de Datos y, a continuación, arrastre todo el objeto o las propiedades individuales a su formulario desde la ventana Orígenes de Datos.
Modificación de los datos en objetos
Para editar datos en objetos personalizados enlazados a controles de Windows Forms, simplemente edite los datos del control enlazado (o directamente en las propiedades del objeto). La arquitectura de enlace de datos actualiza los datos del objeto .
Si su aplicación requiere el seguimiento de los cambios y la reversión de los cambios propuestos a sus valores originales, entonces debe implementar esta funcionalidad en el modelo de objetos. Para obtener ejemplos de cómo las tablas de datos realizan un seguimiento de los cambios propuestos, vea DataRowState, HasChangesy GetChanges.
Guardar datos en objetos de nuevo en la base de datos
Vuelva a guardar los datos en la base de datos pasando los valores del objeto a los métodos DBDirect de TableAdapter.
Visual Studio crea métodos DBDirect que se pueden ejecutar directamente en la base de datos. Estos métodos no requieren objetos DataSet ni DataTable.
| Método DBDirect de TableAdapter | Descripción |
|---|---|
TableAdapter.Insert |
Agrega nuevos registros a una base de datos, lo que le permite pasar valores de columna individuales como parámetros de método. |
TableAdapter.Update |
Actualiza los registros existentes en una base de datos. El método Update toma valores de columna originales y nuevos como parámetros de método. Los valores originales se usan para localizar el registro original y los nuevos valores se usan para actualizar ese registro. El método TableAdapter.Update también se usa para conciliar los cambios de un conjunto de datos de vuelta a la base de datos, tomando un DataSet, DataTable, DataRow o una matriz de DataRow como parámetros del método. |
TableAdapter.Delete |
Elimina los registros existentes de la base de datos en función de los valores de columna originales pasados como parámetros de método. |
Para guardar datos de una colección de objetos, recorra en bucle la colección de objetos (por ejemplo, mediante un bucle for-next). Envíe los valores de cada objeto a la base de datos mediante los métodos DBDirect de TableAdapter.
En el ejemplo siguiente se muestra cómo usar el TableAdapter.Insert método DBDirect para agregar un nuevo cliente directamente a la base de datos:
private void AddNewCustomers(Customer currentCustomer)
{
customersTableAdapter.Insert(
currentCustomer.CustomerID,
currentCustomer.CompanyName,
currentCustomer.ContactName,
currentCustomer.ContactTitle,
currentCustomer.Address,
currentCustomer.City,
currentCustomer.Region,
currentCustomer.PostalCode,
currentCustomer.Country,
currentCustomer.Phone,
currentCustomer.Fax);
}