Compartir a través de


Introducción a conjuntos de datos

Los conjuntos de datos almacenan datos en una memoria caché desconectada. La estructura de un conjunto de datos es similar a la de una base de datos relacional; expone un modelo jerárquico de tablas, filas y columnas. Además, contiene restricciones y relaciones definidas para el conjunto de datos.

Nota   Utilice conjuntos de datos si desea trabajar con una serie de tablas y filas mientras está desconectado del origen de datos. Utilizar conjuntos de datos no es siempre la solución ideal para el diseño de acceso a datos. Para obtener más información, vea Recomendaciones sobre la estrategia de acceso a datos.

Puede crear y manipular conjuntos de datos mediante las siguientes partes de los espacios de nombres de .NET Framework.

Espacio de nombres de conjunto de datos

Las partes fundamentales de un conjunto de datos se exponen al programador mediante construcciones de programación estándar, tales como propiedades y colecciones. Por ejemplo:

  • La clase DataSet incluye la colección Tables de tablas de datos y la colección Relations de objetos DataRelation.
  • La clase DataTable incluye la colección Rows de filas de tabla, la colección Columns de columnas de datos y las colecciones ChildRelations y ParentRelations de relaciones de datos.
  • La clase DataRow incluye la propiedad RowState, cuyos valores indican si la fila cambió, y de qué modo, desde que la tabla de datos se cargó por primera vez desde la base de datos. Entre los posibles valores para la propiedad RowState se encuentran Deleted, Modified, New y Unchanged.

Conjuntos de datos, esquemas y XML

Un conjunto de datos de ADO.NET es una vista relacional de los datos que se pueden representar en XML. En Visual Studio y .NET Framework, XML es el formato para almacenar y transmitir datos de todo tipo. En sí, los conjuntos de datos tienen una estrecha relación con XML. Esta relación entre los conjuntos de datos y XML permite aprovechar las siguientes características de los conjuntos de datos:

  • La estructura de un conjunto de datos, sus tablas, columnas, relaciones y restricciones, puede definirse en un esquema XML. Los esquemas XML son un formato basado en estándares de W3C (World Wide Web Consortium) para la definición de la estructura de datos XML. Los conjuntos de datos pueden leer y escribir esquemas que almacenan información estructurada por medio de los métodos ReadXmlSchema y WriteXmlSchema. Si no hay ningún esquema disponible, el conjunto de datos puede deducir uno (a través del método InferXmlSchema) a partir de los datos de un documento XML estructurado de forma relacional. Para obtener más información sobre los conjuntos de datos y los esquemas, vea Introducción a los esquemas XML.
  • Puede generar una clase de conjunto de datos que incluya información de esquema para definir sus estructuras de datos (como las tablas y las columnas) en forma de miembros de la clase. Vea "Conjuntos de datos con tipo y sin tipo" más adelante.
  • Puede leer un documento o secuencia XML para un conjunto de datos por medio del método ReadXML del conjunto de datos y escribir un conjunto de datos como XML por medio del método WriteXML del conjunto de datos. Debido a que XML es un formato estándar para el intercambio de datos entre diferentes aplicaciones, se puede cargar un conjunto de datos con información en formato XML enviada por otra aplicación. De forma similar, se pueden escribir los datos en forma de documento o secuencia XML para compartirlos con otras aplicaciones o almacenarlos simplemente en un formato estándar.
  • Puede crear una vista XML (un objeto XMLDataDocument) del contenido de un conjunto de datos y, a continuación, ver y manipular los datos por medio de métodos relacionales (a través del conjunto de datos) o de métodos XML. Las dos vistas se sincronizan automáticamente cuando sufren modificaciones.

Conjuntos de datos con tipo y sin tipo

Los conjuntos de datos pueden tener tipo o no. Un conjunto de datos con tipo se deriva en primer lugar de la clase base DataSet y, a continuación, utiliza la información de un archivo de esquema XML (archivo .xsd) para generar una clase nueva. La información del esquema (tablas, columnas, etc.) se genera y compila en esta nueva clase de conjunto de datos como un conjunto de objetos y propiedades de primera clase.

Nota   Para obtener más información sobre esquemas de conjuntos de datos, vea Datos y esquemas XML.

Dado que una clase DataSet con tipo hereda de la clase base DataSet, la clase con tipo asume toda la funcionalidad de la clase DataSet y puede utilizarse con métodos que toman como parámetro una instancia de una clase DataSet.

Por el contrario, un conjunto de datos sin tipo no tiene el esquema integrado correspondiente. Al igual que un conjunto de datos con tipo, un conjunto de datos sin tipo contiene tablas, columnas, etc., pero sólo se exponen como colecciones. No obstante, después de crear manualmente las tablas y otros elementos de datos de un conjunto de datos sin tipo, se puede exportar la estructura del conjunto de datos en forma de esquema por medio del método WriteXmlSchema del conjunto de datos.

Puede utilizar en las aplicaciones cualquiera de estos tipos de conjunto de datos. Sin embargo, Visual Studio proporciona más herramientas para los conjuntos de datos con tipo, que hacen que la programación con el conjunto de datos sea más sencilla y tenga menor probabilidad de error.

Comparación del acceso a datos en conjuntos de datos con tipo y sin tipo

La clase de un conjunto de datos con tipo tiene un modelo de objetos en el que las tablas y las columnas se convierten en objetos de primera clase del modelo de objetos. Por ejemplo, si está trabajando con un conjunto de datos con tipo, puede hacer referencia a una columna utilizando código similar al siguiente:

' Visual Basic
' This accesses the CustomerID column in the first row of 
' the Customers table.
Dim s As String
s = dsCustomersOrders1.Customers(0).CustomerID

// C#
// This accesses the CustomerID column in the first row of 
// the Customers table.
string s;
s = dsCustomersOrders1.Customers[0].CustomerID;

Por el contrario, si está trabajando con un conjunto de datos sin tipo, el código equivalente es el siguiente:

' Visual Basic
Dim s As String
s = CType(dsCustomersOrders1.Tables("Customers").Rows(0).Item("CustomerID"), String)

// C#
string s = (string) dsCustomersOrders1.Tables["Customers"].Rows[0]["CustomerID"];

El acceso con tipo no sólo es más fácil de leer, sino que es totalmente compatible con IntelliSense en el editor de código de Visual Studio. Además de ser más cómodo para trabajar, la sintaxis para el conjunto de datos con tipo proporciona comprobación de tipos en tiempo de compilación, lo que reduce en gran medida la posibilidad de cometer errores al asignar valores a los miembros del conjunto de datos. El acceso a las tablas y las columnas de un conjunto de datos con tipo también es algo más rápido en tiempo de ejecución porque el acceso se determina en tiempo de compilación, no a través de colecciones en tiempo de ejecución.

Aunque el uso de conjuntos de datos con tipo tiene muchas ventajas, hay circunstancias en las que es útil utilizar un conjunto de datos sin tipo. El escenario más evidente es aquél en el que no hay un esquema disponible para el conjunto de datos. Esto puede ocurrir, por ejemplo, si la aplicación interacciona con un componente que devuelve un conjunto de datos, pero no se conoce previamente cuál es la estructura. De forma similar, hay ocasiones en que se trabaja con datos que no tienen una estructura estática y previsible; en este caso, no es práctico utilizar un conjunto de datos con tipo, porque habría que volver a generar la clase del conjunto de datos con tipo después de cada cambio de la estructura de datos.

En general, hay muchas ocasiones en que se podría crear un conjunto de datos dinámicamente, sin disponer de un esquema. En este caso, el conjunto de datos no es más que una estructura práctica para conservar la información, mientras los datos puedan representarse de forma relacional. Al mismo tiempo, se pueden aprovechar las ventajas del conjunto de datos, por ejemplo la capacidad de serializar la información que se pasa a otro proceso o de escribir un archivo XML.

Distinguir mayúsculas de minúsculas en un conjunto de datos

Dentro de un conjunto de datos, los nombres de las tablas y columnas no distinguen entre mayúsculas y minúsculas de forma predeterminada; es decir, a una tabla denominada "Clientes" en un conjunto de datos se puede hacer referencia también como "clientes". Esto satisface las convenciones de denominación de muchas bases de datos, incluida SQL Server, donde los nombres de los elementos de datos no pueden distinguirse sólo por su grafía.

Nota   A diferencia de los conjuntos de datos, los documentos XML distinguen entre mayúsculas y minúsculas, de modo que los nombres de los elementos de datos que se definen en los esquemas distinguen entre mayúsculas y minúsculas. Por ejemplo, el protocolo de esquema permite que el esquema contenga una tabla denominada "Clientes" y otra tabla denominada "clientes". Esto puede producir conflictos de nombres cuando se utiliza un esquema para generar una clase de conjunto de datos. Para obtener más información, vea Elementos, atributos y tipos XML.

Sin embargo, la capacidad de distinguir entre mayúsculas y minúsculas puede ser un factor importante para la interpretación de los datos dentro del conjunto de datos. Por ejemplo, si filtra los datos de una tabla de un conjunto de datos, los criterios de búsqueda podrían devolver resultados diferentes dependiendo de que la comparación distinga o no entre mayúsculas y minúsculas. Para controlar la capacidad de distinguir entre mayúsculas y minúsculas al filtrar, buscar y ordenar, puede establecer la propiedad CaseSensitive del conjunto de datos. Todas las tablas del conjunto de datos heredan el valor de esta propiedad de forma predeterminada. Puede reemplazar esta propiedad para cada tabla individual.

Llenar conjuntos de datos

Un conjunto de datos es un contenedor; por lo tanto, deberá llenarlo con datos. Cuando se llena un conjunto de datos, se producen diversos eventos, se aplica la comprobación de las restricciones, etc. Para obtener más información sobre la actualización de los conjuntos de datos y los asuntos relacionados con las actualizaciones, vea Actualizaciones de conjuntos de datos en Visual Studio .NET.

Para llenar un conjunto de datos se pueden seguir varios procedimientos:

  • Llamar al método Fill de un adaptador de datos. Esto provoca que el adaptador ejecute una instrucción SQL o un procedimiento almacenado y guarde los resultados en una tabla del conjunto de datos. Si el conjunto de datos contiene varias tablas, es probable que se tengan adaptadores de datos independientes para cada tabla y, en consecuencia, se deberá llamar al método Fill de cada adaptador por separado.

    Para obtener más información sobre cómo se llenan conjuntos de datos, vea Introducción a los adaptadores de datos y Crear adaptadores de datos. Para obtener más información sobre cómo se utiliza un adaptador de datos para llenar un conjunto de datos, vea Llenar un objeto DataSet con datos de un objeto DataAdapter.

  • Llenar manualmente las tablas del conjunto de datos; para ello, cree objetos DataRow y agréguelos a la colección Rows de la tabla. Esto sólo se puede hacer en tiempo de ejecución; no se puede establecer la colección Rows en tiempo de diseño. Para obtener más información, vea Agregar datos a una tabla.

  • Leer un documento o una secuencia XML para el conjunto de datos. Para obtener más información, vea el método ReadXml.

  • Combinar (copiar) el contenido de otro conjunto de datos. Este escenario puede ser útil si la aplicación obtiene conjuntos de datos de diferentes orígenes (por ejemplo, diferentes servicios Web XML), pero necesita consolidarlos en un solo conjunto de datos. Para obtener más información, vea el método DataSet.Merge.

Posición de registros y desplazamiento por conjuntos de datos

Dado que un conjunto de datos es un contenedor de datos totalmente desconectado, los conjuntos de datos (a diferencia de los conjuntos de registros ADO) no necesitan ni admiten el concepto de registro actual. Por el contrario, todos los registros del conjunto de datos están disponibles.

Dado que no existe un registro actual, no hay ninguna propiedad específica que apunte al registro actual, ni existen métodos y propiedades para desplazarse de un registro a otro. Por el contrario, los conjuntos de registros ADO admiten una posición de registros absoluta y métodos para el desplazamiento de un registro al siguiente. Puede tener acceso a tablas individuales del conjunto de datos como objetos; cada tabla expone una colección de filas. Puede tratarla como cualquier colección, tener acceso a las filas por medio del índice de la colección o utilizar instrucciones específicas de la colección en el lenguaje de programación.

Nota   Si está enlazando controles de formularios Windows Forms a un conjunto de datos, puede utilizar la arquitectura de enlace del formulario para simplificar el acceso a los registros individuales. Para obtener más información, vea Explorar datos en formularios Windows Forms.

Tablas relacionadas y objetos DataRelation

Si tiene varias tablas en un conjunto de datos, es posible que la información de las tablas esté relacionada. Un conjunto de datos no posee un conocimiento intrínseco de dichas relaciones; en consecuencia, para trabajar con datos de tablas relacionadas, puede crear objetos DataRelation que describan las relaciones existentes entre las tablas del conjunto de datos. Los objetos DataRelation pueden utilizarse para obtener mediante programación registros secundarios relacionados con un registro primario, o un registro primario a partir de un registro secundario.

Por ejemplo, imagine datos de clientes y pedidos como los de la base de datos Northwind. La tabla Pedidos podría contener registros como los siguientes:

CustomerID   CompanyName               City
ALFKI        Alfreds Futterkiste       Berlin
ANTON        Antonio Moreno Taquerias  Mexico D.F.
AROUT        Around the Horn           London

El conjunto de datos podría contener también otra tabla con información de pedidos. La tabla Pedidos contiene un identificador de cliente como columna de clave externa. Si se seleccionaran sólo algunas columnas de la tabla Pedidos, podrían tener el siguiente aspecto:

OrderId    CustomerID    OrderDate
10692      ALFKI         10/03/1997
10702      ALFKI         10/13/1997
10365      ANTON         11/27/1996
10507      ANTON         4/15/1997

Dado que cada cliente puede tener más de un pedido, existe una relación uno a varios entre clientes y pedidos. Por ejemplo, en la tabla anterior, el cliente ALFKI tiene dos pedidos.

Puede utilizar un objeto DataRelation para obtener registros relacionados procedentes de una tabla secundaria o primaria. Por ejemplo, cuando trabaje con el registro que describe al cliente ANTON, puede obtener la colección de registros que describen los pedidos de este cliente. De forma similar, si está trabajando con el registro que describe el número de pedido 10507, puede utilizar un objeto DataRelation para obtener el registro que describa el cliente de dicho pedido (ANTON).

Restricciones

Como sucede en la mayoría de las bases de datos, los conjuntos de datos admiten restricciones como un medio para garantizar la integridad de los datos. Las restricciones son reglas que se aplican cuando se insertan, actualizan o eliminan filas en una tabla. Puede definir dos tipos de restricciones:

  • Una restricción UNIQUE que comprueba si los nuevos valores de una columna son únicos en la tabla.
  • Una restricción FOREIGN KEY que define reglas sobre cómo deben actualizarse los registros secundarios relacionados cuando se actualiza o se elimina un registro de una tabla maestra.

En un conjunto de datos, las restricciones se asocian a tablas individuales (restricciones FOREIGN KEY) o columnas (restricción UNIQUE, que garantiza que los valores de la columna son únicos). Las restricciones se implementan como objetos de tipo UniqueConstraint o ForeignKeyConstraint. A continuación, se agregan a la colección Constraints de una tabla. Alternativamente, una restricción UNIQUE se puede especificar estableciendo la propiedad Unique de una columna de datos en true.

El propio conjunto de datos admite una propiedad EnforceConstraints, de tipo Boolean, que especifica si se exigirá o no el cumplimiento de las restricciones. De forma predeterminada, esta propiedad se establece en true. Sin embargo, hay ocasiones en que es útil desactivar temporalmente las restricciones. Normalmente, esto sucede cuando se modifica un registro de modo que provoca temporalmente un estado no válido. Después de completar el cambio (y, por tanto, de volver a un estado válido), puede habilitar de nuevo las restricciones.

En Visual Studio se crean restricciones de forma implícita al definir un conjunto de datos. Al agregar una clave principal a un conjunto de datos, se crea de forma implícita una restricción UNIQUE para la columna de clave principal. Para especificar una restricción UNIQUE para otras columnas, puede establecer su propiedad Unique en true.

Para crear restricciones FOREIGN KEY, cree un objeto DataRelation en el conjunto de datos. Además de permitir que se obtenga información mediante programación sobre los registros relacionados, un objeto DataRelation permite definir reglas de restricción FOREIGN KEY.

Para obtener más información acerca del uso de objetos DataRelation como restricciones FOREIGN KEY, vea Introducción a los objetos DataRelation. Para obtener más información sobre la creación de restricciones mediante programación, vea Agregar restricciones a una tabla.

Actualizar conjuntos de datos y almacenes de datos

Cuando se realizan cambios en los registros de un conjunto de datos, es necesario escribir los cambios en la base de datos. Para escribir los cambios de un conjunto de datos en la base de datos, deberá llamar al método Update del adaptador de datos a través del cual se comunican el conjunto de datos y su correspondiente origen de datos.

La clase DataRow, que se utiliza para manipular registros individuales, incluye la propiedad RowState, cuyos valores indican si la fila cambió, y de qué modo, desde que la tabla de datos se cargó por primera vez desde la base de datos. Entre los posibles valores se encuentran Deleted, Modified, New y Unchanged. El método Update examina el valor de la propiedad RowState para determinar qué registros deben escribirse en la base de datos y qué comando específico de la base de datos (agregar, editar, eliminar) debe invocarse.

Para obtener más información sobre la actualización de datos, vea Actualizaciones de conjuntos de datos en Visual Studio .NET.

Vea también

Introducción al acceso a datos con ADO.NET | Introducción a los adaptadores de datos | Herramientas de Visual Studio para crear conjuntos de datos | Crear conjuntos de datos con tipo con el Diseñador de componentes | Crear conjuntos de datos y esquemas XML | Agregar conjuntos de datos con tipo existentes a un formulario o un componente | Agregar conjuntos de datos sin tipo a un formulario o un componente | Tutoriales sobre datos