Cómo crear un objeto DataSet con declaración de tipos con Visual Studio
Por Enrique Martínez Montejo
Última revisión: 27/06/2007
 

Un objeto DataSet con declaración de tipos (o DataSet tipado, como suelen denominarlo algunos usuarios de los grupos de noticias de .net), simplemente es un objeto DataSet normal, ya que deriva de la propia clase System.Data.DataSet, pero que en lugar de tener los objetos DataTable dentro de una colección denominada Tables, dispone de ellos como propiedades de la propia clase del objeto DataSet con declaración de tipos creado.

Hay varias formas de crear con Visual Studio un objeto DataSet con declaración de tipos. Quizás, la más utilizada por los usuarios sea ejecutando el Asistente para la configuración de orígenes de datos (Figura 1), que podrá acceder al mismo seleccionando la opción Agregar nuevo origen de datos existente en el menú Datos. En este artículo, vamos a dejar a un lado a los asistentes, y crearemos el conjunto de datos nosotros mismos, lo que no significa que tengamos que escribir una gran cantidad de código XML, porque de ello también se encargará el propio Visual Studio.

 

Figura 1. Asistente para la configuración de orígenes de datos

Lo primero que tiene que hacer es iniciar un nuevo proyecto de Visual Basic, seleccionando la opción Proyecto vacío (Figura 2). Esto hará que Visual Studio nos presente un proyecto sin ningún tipo de "aditivos añadidos", tales como formularios, módulos de clase, o de cualquier otra naturaleza. El objetivo de éste artículo es crear desde cero un proyecto de Visual Basic, que sea capaz de mostrar en un control DataGridView los datos de la tabla Customers de la base de datos Northwind de Microsoft SQL Server 2000, y de actualizar la fuente de datos con las modificaciones introducidas por el usuario.

NOTA: Debido a que la tabla Customers de la base de datos Northwind, puede modificarse como resultado de la ejecución del proyecto de ejemplo, le recomiendo que haga una copia de seguridad para que posteriormente pueda restaurarla si ese es su deseo.

 

Figura 2. Cuadro de diálogo Nuevo proyecto, desde donde podrá indicar su intención de crear un proyecto vacío.

Como los proyectos vacíos de Visual Basic no tienen referenciada ninguna biblioteca, tendremos que añadírlas manualmente. Para ello, haga clic con el botón secundario del ratón en el nombre del proyecto existente en la ventana Explorador de soluciones, y seleccione la opción Agregar referencia. Procure que la ficha .NET del cuadro de diálogo Agregar referencia se encuentra activa, y seleccione los siguientes ensamblados, mientras mantiene pulsada la tecla Ctrl:

NOTA: Estas referencias se crean automáticamente cuando añadimos al proyecto un nuevo conjunto de datos. Pero puede suceder que éstas referencien a otras versiones de los mismos ensamblados instalados en el equipo, produciéndose casos ambiguos en los nombres de las clases existentes en ensamblados distintos, por lo que mi consejo es que usted mismo añada manualmente las referencias apropiadas al proyecto.

A continuación, desde el Explorador de servidores vamos a crear una nueva conexión que apunte a la base de datos Northwind de SQL Server 2000. Por supuesto, si no dispone de esta base de datos, o bien, de una versión cualquiera de Microsoft SQL Server, no importa, porque puede crear el conjunto de datos para que señale a un origen de datos OleDb, como por ejemplo, a una base de datos Microsoft Access. Eso sí, le recomiendo encarecidamente que la tabla que elija de la base de datos, tenga establecida una clave principal, a fin que el generador del objeto DataSet con declaración de tipos, pueda construir adecuadamente las consultas SQL de actualización (INSERT INTO, UPDATE y DELETE). De no existir una clave principal, el trabajo de construir el objeto DataSet se puede complicar un poco más.

Una vez añadida la conexión al Explorador de servidores (Figura 3), procederemos ahora a crear el propio objeto DataSet con declaración de tipos. Para ello seleccione agregar un nuevo elemento al proyecto, y elija la opción Conjunto de datos (Figura 4), dejando el mismo nombre de archivo que nos propone Visual Studio (DataSet1.xsd). Esto hace que se abra de inmediato el Diseñador del DataSet, donde se nos indica que arrastremos elementos de la base de datos existente en el Explorador de servidores.

 

Figura 3. Ventana del Explorador de servidores, donde se encuentra seleccionada la conexión con la base de datos Northwind.

 

Figura 4. Cuadro de diálogo Agregar nuevo elemento, desde donde podrá seleccionar un conjunto de datos.

Como se supone que ya tiene creada la conexión con la base de datos Northwind en el Explorador de servidores, simplemente deberá desplegar la colección de tablas de la base de datos, para arrastrar la tabla Customers al Diseñador del DataSet (Figura 5). Esta simple operación es todo lo que necesita hacer para crear un objeto DataSet con declaración de tipos. Como verá, la operación ha sido mucho más fácil que utilizando el Asistente para la configuración de orígenes de datos.

 

Figura 5. Vista del conjunto de datos creado en la ventana Diseñador del DataSet.

Podrá observar que se ha creado un objeto DataTable llamado Customers (o con el nombre de la tabla seleccionada, si la conexión la ha creado utilizando otra base de datos distinta), y un objeto TableAdapter que se llamará igual que la tabla seguido del término TableAdapter, como por ejemplo, CustomersTableAdapter. Por supuesto que puede modificar el nombre de los objetos, desde la propia ventana de Propiedades, pero por ahora, deje el nombre que por defecto asigna Visual Studio.

El objeto DataTable creado contiene la colección de objetos Column, que como es de esperar, contiene los campos de la tabla Customers, teniendo la oportunidad de modificar los valores de las propiedades de los campos. Recorra los campos y observe en la ventana Propiedades que los valores de las columnas son correctos: nombre del campo, tipo de dato, longitud máxima de la columna, etc.

El objeto TableAdapter creado, lo que en realidad encapsula es un objeto DataAdapter correspondiente al proveedor de datos .net utilizado, en este caso un objeto SqlDataAdapter. Como es sabido, el objeto DataAdapter es el objeto que sirve de puente entre nuestra aplicación y la base de datos, por lo que se utiliza tanto para seleccionar los datos, como para actualizar los mismos.

Como objeto DataAdapter que es, el objeto TableAdapter creado también tiene las clásicas propiedades del primero, las cuales podrá observarlas en la ventana de Propiedades. No estaría de más que le echara un vistazo a las propiedades SelectCommand, InsertCommand, DeleteCommand y UpdateCommand, mayormente para que conozca las distintas consultas SQL y colección de objetos Parameters que Visual Studio ha creado por nosotros, cuestión ésta que hay que agradecer por el trabajo que nos ahorra a los programadores de aplicaciones de bases de datos.

Asimismo, la operación de crear el conjunto de datos también nos ha creado una propiedad de aplicación, que en realidad contiene la cadena de conexión que se ha utilizado para crear el conjunto de datos, y que será la que posteriormente utilizará la aplicación para conectarse con la base de datos. Si desea conocer la cadena de conexión, abra las propiedades del proyecto (Figura 6), y seleccione la ficha Configuración. Por defecto, el nombre de la propiedad tendrá el nombre de la base de datos seguido del término ConnectionString, por tanto le aparecerá el nombre NorthwindConnectionString, siendo el ámbito de la propiedad el de la propia aplicación.

 

Figura 6. Vista de la propiedad de aplicación NorthwindConnectionString.

Una vez conocidas las propiedades del conjunto de datos creado, ya puede cerrar el Diseñador del DataSet una vez que haya guardado los cambios en el archivo correspondiente al conjunto de datos creado (DataSet1.xsd).

Añada ahora un nuevo formulario al proyecto, y hágalo el Objeto inicial de la aplicación. Para ello, abra nuevamente las propiedades del proyecto, y en la ficha Aplicación, despliegue el cuadro combinado Objeto inicial para seleccionar el formulario de inicio. En esa misma ficha podrá observar que no es posible habilitar el marco de trabajo de la aplicación, y por tanto, los estilos visuales de Windows XP. No se preocupe, porque lo habilitaremos en tiempo de ejecución.

La operación de añadir un formulario al proyecto vacío de Visual Basic, hace que automáticamente se referencien también los siguientes ensamblados:

Creado el formulario de inicio, ya puede proceder a generar la aplicación para que el conjunto de datos y el objeto TableAdapter creados, puedan visualizarse correctamente en el Cuadro de Herramientas, en concreto, en el apartado de Componentes del proyecto (Figura 7).

 

Figura 7. Vista del Cuadro de Herramientas, con los objetos correspondientes al conjunto de datos creado.

Abra el formulario de inicio de nuestra aplicación, y añádale un control DataGridView y dos controles Button (Figura 8). Igualmente, arrastre desde el Cuadro de Herramientas al formulario, una instancia del componente DataSet1 y otra del componente CustomersTableAdapter, que como es de esperar, ambos se alojarán en la Bandeja de Componentes del diseñador de formularios de Windows.

Ya sólo nos queda escribir el código adecuado para mostrar los datos en el control DataGridView, y poder actualizar la tabla de la base de datos. Abra el módulo de código del formulario de inicio, y pegue el siguiente código:

Imports System.Windows.Forms

Public Class Form1

    Private Sub Form1_Load( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles MyBase.Load

        ' Habilitamos los estilos visuales de Windows XP.
        '

        Application.EnableVisualStyles()

        With Me
            .Text = "Creación de un Conjunto de Datos"

            .Button1.Text = "Cargar"
            .Button2.Text = "Guardar"
            .Button1.Select()

            .DataGridView1.DataSource = DataSet11
            .DataGridView1.DataMember = "Customers"
        End With

    End Sub

    Private Sub Button1_Click( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click

        ' Rellenamos el objeto DataSet.
        '

        Try
            Me.CustomersTableAdapter1.Fill(Me.DataSet11.Customers)

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try
   
    End Sub

    Private Sub Button2_Click( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button2.Click

        ' Actualizamos la base de datos
        '

        Try
            Me.CustomersTableAdapter1.Update(Me.DataSet11.Customers)

        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try

    End Sub

End
Class

Si desea actualizar la tabla Customers, procure modificar cualquier campo distinto del campo CustomerID, que es el que forma la clave principal de la tabla, porque de hacerlo, obtendrá la correpondiente excepción en tiempo de ejecución, debido a que dicho campo se encuentra relacionado con el campo del mismo nombre de la tabla Orders.

Como habrá tenido la oportunidad de comprobar, mediante la utilización de objetos DataSet con declaración de tipos, disponemos de una manera fácil y eficaz de actualizar una base de datos utilizando el modo desconectado que nos dispensa ADO .NET.

Espero que el artículo haya sido de su interés, sobre todo, para los nuevos usuarios que están comenzando con el diseño de aplicaciones de bases de datos utilizando Visual Basic net.

 

Figura 8. El formulario cargado con los datos correspondientes a la tabla Customers.

 

Otros enlaces de interés:

Indice de Ejemplos de ADO .NET


Enrique Martínez Montejo - 2007

NOTA: La información contenida en este artículo, así como el código fuente incluido en el mismo, se proporciona COMO ESTÁ, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artículo.

NOTE: The information contained in this article and source code included therein, is provided AS IS without warranty of any kind, and confers no rights. You assume any risk to implement, use or run it explained, recommended or suggested in this article.