Share via


Rellenar conjuntos de datos mediante TableAdapters en aplicaciones de .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.

Un componente TableAdapter rellena un conjunto de datos con datos de la base de datos, en función de una o varias consultas o procedimientos almacenados que especifique. Los elementos TableAdapter también puede realizar adiciones, actualizaciones y eliminaciones en la base de datos para conservar los cambios realizados en el conjunto de datos. Además, se pueden emitir comandos globales que no estén relacionados con ninguna tabla específica.

Nota

Los diseñadores de Visual Studio generan elementos TableAdapter. Si va a crear conjuntos de datos mediante programación, use mejor DataAdapter, que es una clase .NET.

Para información detallada sobre las operaciones de TableAdapter, puede ir directamente a uno de estos temas:

Tema Descripción
Crear y configurar TableAdapters Uso de los diseñadores para crear y configurar elementos TableAdapter
Crear consultas parametrizadas de TableAdapter Permitir que los usuarios proporcionen argumentos a procedimientos o consultas de TableAdapter
Acceder directamente a la base de datos con un TableAdapter Uso de los métodos Dbdirect de elementos TableAdapter
Desactivar restricciones al llenar un conjunto de datos Uso de restricciones de clave externa al actualizar datos
Cómo extender la funcionalidad de un TableAdapter Adición de código personalizado a elementos TableAdapter
Leer datos XML en un conjunto de datos Uso de XML

Introducción a TableAdapter

Los elementos TableAdapter son componentes generados por un diseñador que se conectan a una base de datos, ejecutan consultas o procedimientos almacenados y rellenan su DataTable con los datos devueltos. También devuelven los datos actualizados de la aplicación a la base de datos. Puede ejecutar tantas consultas como desee en un elemento TableAdapter siempre y cuando devuelvan datos que se ajusten al esquema de la tabla con la que está asociado el elemento TableAdapter. En el diagrama siguiente se muestra cómo interactúan los elementos TableAdapter con bases de datos y otros objetos en memoria:

Data flow in a client application

Aunque los elementos TableAdapter están diseñados con el Diseñador de DataSet, las clases TableAdapter generadas no se generan como clases anidadas de DataSet. Se encuentran en espacios de nombres distintos que son específicos de cada conjunto de datos. Por ejemplo, si tiene un conjunto de datos llamado NorthwindDataSet, los elementos TableAdapter asociados a objetos DataTable en NorthwindDataSet estarían en el espacio de nombres NorthwindDataSetTableAdapters. Para tener acceso a un TableAdapter determinado mediante programación, debe declarar una nueva instancia del TableAdapter. Por ejemplo:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

Esquema de DataTable asociado

Al crear un elemento TableAdapter, se emplea la consulta o el procedimiento almacenado inicial para definir el esquema del objeto DataTable asociado de TableAdapter. Esta consulta o procedimiento almacenado inicial se ejecuta llamando al método Fill de TableAdapter (que rellena el objeto DataTable asociado de TableAdapter). Cualquier cambio realizado en la consulta principal de TableAdapter se refleja en el esquema de la tabla de datos asociada. Por ejemplo, al quitar una columna de la consulta principal, se quita la columna de la tabla de datos asociada. Si alguna consulta adicional de TableAdapter usa instrucciones SQL que devuelven columnas que no están en la consulta principal, el diseñador intenta sincronizar los cambios de columna entre la consulta principal y las consultas adicionales.

Comandos de actualización de TableAdapter

La funcionalidad de actualización de un elemento TableAdapter depende de la cantidad de información disponible en la consulta principal del Asistente para TableAdapter. Por ejemplo, los elementos TableAdapter configurados para obtener valores de varias tablas (mediante JOIN), valores escalares, vistas o los resultados de funciones de agregado no se crean inicialmente con la capacidad de devolver actualizaciones a la base de datos subyacente. Sin embargo, puede configurar manualmente los comandos INSERT, UPDATE y DELETE en la ventana Propiedades.

consultas TableAdapter

TableAdapter with multiple queries

Los elementos TableAdapter pueden contener varias consultas para rellenar las tablas de datos asociadas. Puede definir tantas consultas para un TableAdapter como requiera la aplicación, con tal de que cada consulta devuelva datos que cumplan el mismo esquema que la tabla de datos asociada. Esta funcionalidad permite que un elemento TableAdapter cargue resultados diferentes en función de criterios diferentes.

Por ejemplo, si la aplicación contiene una tabla con nombres de clientes, puede crear una consulta que rellene la tabla con todos los nombres de clientes que comiencen con una letra determinada y otra consulta que rellene la tabla con todos los clientes del mismo estado o provincia. Para rellenar una tabla Customers con clientes de un estado o provincia concretos, puede crear una consulta FillByState que tome un parámetro para el valor de estado o provincia, de la manera siguiente SELECT * FROM Customers WHERE State = @State. Para ejecutar la consulta, llame al método FillByState y pase el valor del parámetro como CustomerTableAdapter.FillByState("WA").

Además de consultas que devuelven datos del mismo esquema como la tabla de datos de TableAdapter, también puede agregar consultas que devuelvan valores escalares (únicos). Por ejemplo, una consulta que devuelva un recuento de clientes (SELECT Count(*) From Customers) es una consulta válida para CustomersTableAdapter,, aunque los datos devueltos no cumplan el esquema de la tabla.

Propiedad ClearBeforeFill

De manera predeterminada, cada vez que ejecuta una consulta para rellenar la tabla de datos de TableAdapter, se borran los datos existentes y solo se cargan en la tabla los resultados de la consulta. Establezca la propiedad ClearBeforeFill de TableAdapter en false si quiere agregar o fusionar mediante combinación los datos devueltos de una consulta con los datos existentes de una tabla de datos. Sin importar que borre los datos, es necesario devolver explícitamente las actualizaciones a la base de datos, si quiere conservarlas. Por tanto, recuerde guardar los cambios realizados en los datos de la tabla antes de ejecutar otra consulta que rellene la tabla. Para más información, consulte Actualización de datos mediante un elemento TableAdapter.

Herencia de TableAdapter

Los elementos TableAdapter amplían la funcionalidad de los adaptadores de datos estándar mediante la encapsulación de una clase DataAdapter configurada. De manera predeterminada, el elemento TableAdapter hereda de la clase Component y no se puede convertir a la clase DataAdapter. La conversión de un elemento TableAdapter a la clase DataAdapter produce un error InvalidCastException. Para cambiar la clase base de un elemento TableAdapter, puede especificar una clase que se derive de Component en la propiedad Clase base del elemento TableAdapter en el Diseñador de DataSet.

Métodos y propiedades de TableAdapter

La clase TableAdapter no es un tipo .NET. Esto significa que no se puede buscar en la documentación ni en el Explorador de objetos. Se crea en tiempo de diseño cuando se usa uno de los asistentes anteriormente mencionados. El nombre asignado a un elemento TableAdapter en el momento de su creación se basa en el nombre de la tabla con la que está trabajando. Por ejemplo, si se crea un elemento TableAdapter basado en una tabla de una base de datos llamada Orders, dicho elemento se llamará OrdersTableAdapter. Se puede cambiar el nombre de clase del TableAdapter utilizando la propiedad Name en el Diseñador de DataSet.

A continuación se muestran los métodos y propiedades de TableAdapter más usados:

Miembro Descripción
TableAdapter.Fill Rellena la tabla de datos asociada del elemento TableAdapter con los resultados del comando SELECT de dicho elemento.
TableAdapter.Update Devuelve los cambios a la base de datos, junto con un entero que representa el número de filas a las que afecta la actualización. Para más información, consulte Actualización de datos mediante un elemento TableAdapter.
TableAdapter.GetData Devuelve un nuevo objeto DataTable rellenado con datos.
TableAdapter.Insert Crea una nueva fila en la tabla de datos. Para más información, consulte Inserción de nuevos registros en una base de datos.
TableAdapter.ClearBeforeFill Determina si se vacía una tabla de datos antes de llamar a uno de los métodos Fill.

Método de actualización de TableAdapter

Los TableAdapter utilizan comandos de datos para leer y escribir en la base de datos. Use la consulta Fill (principal) inicial de TableAdapter como base para crear el esquema de la tabla de datos asociada, así como los comandos InsertCommand, UpdateCommand y DeleteCommand asociados al método TableAdapter.Update. Al llamar al método Update del elemento TableAdapter se ejecutan las instrucciones creadas cuando este elemento se configuró originalmente, y no las consultas adicionales que se agregaron con el Asistente para la configuración de consultas de TableAdapter.

Cuando se usa un elemento TableAdapter, este realiza las mismas operaciones con los comandos que usted realizaría habitualmente. Por ejemplo, cuando se llama al método Fill del adaptador, se ejecuta el comando de datos en su propiedad SelectCommand y se usa un lector de datos (por ejemplo, SqlDataReader) para cargar el conjunto de resultados en la tabla de datos. De igual forma, cuando se llama al método Update del adaptador, se ejecuta el comando adecuado (en las propiedades UpdateCommand, InsertCommand y DeleteCommand) para cada registro modificado de la tabla de datos.

Nota

Si hay bastante información en la consulta principal, se crean los comandos InsertCommand, UpdateCommand y DeleteCommand de manera predeterminada cuando se genera el TableAdapter. Si la consulta principal de TableAdapter es más que una instrucción SELECT de una única tabla, es posible que el diseñador no pueda generar los comandos InsertCommand, UpdateCommand y DeleteCommand. Si no se han generado estos comandos, puede recibir un error al ejecutar el método TableAdapter.Update.

TableAdapter GenerateDbDirectMethods

Además de con los comandos InsertCommand, UpdateCommand y DeleteCommand, los elementos TableAdapter se crean con métodos que se pueden ejecutar directamente en la base de datos. Se puede llamar a estos métodos (TableAdapter.Insert, TableAdapter.Update y TableAdapter.Delete) para manipular los datos en la base de datos. Esto significa que puede llamar a estos métodos individuales con su código en lugar de llamar a TableAdapter.Update para controlar las inserciones, actualizaciones y eliminaciones que están pendientes para la tabla de datos asociada.

Si no quiere crear estos métodos directos, establezca la propiedad GenerateDbDirectMethods del elemento TableAdapter en false (en la ventana Propiedades). Las consultas adicionales agregadas al elemento TableAdapter son consultas independientes y no generan estos métodos.

Compatibilidad del objeto TableAdapter con los tipos que aceptan valores NULL

Los elementos TableAdapter admiten los tipos que aceptan valores NULL Nullable(Of T) y T?. Para más información sobre los tipos que aceptan valores NULL en Visual Basic, vea Tipos que admiten valores null. Para más información sobre los tipos que aceptan valores NULL en C#, consulte Uso de tipos que aceptan valores NULL.

Referencia de TableAdapterManager

De forma predeterminada, una clase TableAdapterManager se genera al crear un conjunto de datos que contiene tablas relacionadas. Para evitar que se genere la clase, cambie el valor de la propiedad Hierarchical Update del conjunto de datos a false. Al arrastrar una tabla que tiene una relación por la superficie de diseño de una página de Windows Form o WPF, Visual Studio declara una variable miembro de la clase. Si no usa el enlace de datos, debe declarar manualmente la variable.

La clase TableAdapterManager no es un tipo .NET. Por lo tanto, no puede buscarlo en la documentación. Se crea en tiempo de diseño como parte del proceso de creación del conjunto de datos.

A continuación, se muestran los métodos y propiedades usados con frecuencia de la clase TableAdapterManager:

Miembro Descripción
Método UpdateAll Guarda todos los datos de todas las tablas de datos.
Propiedad BackUpDataSetBeforeUpdate Determina si se va a crear una copia de seguridad del conjunto de datos antes de ejecutar el método TableAdapterManager.UpdateAll.
Propiedad tableNameTableAdapter Representa un TableAdapter. El objeto TableAdapterManager generado contiene una propiedad para cada elemento TableAdapter que administra. Por ejemplo, un conjunto de datos con una tabla "Clientes y pedidos" se genera con un objeto TableAdapterManager que contiene las propiedades CustomersTableAdapter y OrdersTableAdapter.
Propiedad UpdateOrder Controla el orden de los comandos individuales de inserción, actualización y eliminación. Establezca esta propiedad en uno de los valores de la enumeración TableAdapterManager.UpdateOrderOption.

De forma predeterminada, UpdateOrder se establece en InsertUpdateDelete. Esto significa que las inserciones, las actualizaciones y las eliminaciones se realizan para todas las tablas del conjunto de datos.

Seguridad

Cuando use comandos de datos con una propiedad CommandType establecida en Text, compruebe minuciosamente la información enviada desde el cliente antes de pasarla a la base de datos. Usuarios con malas intenciones podrían intentar enviar (inyectar) instrucciones de SQL modificadas o adicionales con el fin de obtener acceso no autorizado o dañar la base de datos. Antes de transferir la entrada del usuario a una base de datos, compruebe siempre que la información sea válida. Un procedimiento recomendado es usar siempre que sea posible consultas o procedimientos almacenados parametrizados.