Visual Studio 2005 – TableAdapters

Hace unos días, revisando las opciones para generar código automáticamente, me encontré con una agradable sorpresa, los TableAdapters. Este nuevo modelo, unido a un par de DataSet tipados, puede brindarnos grandes satisfacciones. Básicamente, constituyen una capa de acceso a datos en si misma, utilizando todas las primitivas de Ado.Net y aprovechando las ventajas de un editor 100% visual.

   

Antes de emitir un voto a favor, vemos en un par de pasos los puntos más interesantes a seguir.

   

  1. Dentro de VS2005, agregamos un nuevo DataSet a nuestro proyecto. En este caso trabajaremos con la base de datos Pubs, y arrastramos (Drag and Drop) la tabla Authors al diseñador de DataSet.

   

  1. Dentro del diseñador, en la sección del TableDataAdapter, podemos ver que poseemos las funciones Fill() y GetData() (la diferencia entre ambas radica en que la primera rellena un Table y la segunda retorna un Table). Si queremos agregar nuestras funciones personalizadas para trabajar directamente con los datos de la tabla Authors podemos hacer lo siguiente:
    • Botón derecho y seleccionar la opción Add Query. Esta pantalla nos presenta las opciones
    • Utilizar una sentencia SQL.
    • Agregar un store procedure.
    • Utilizar un store procedure ya existente.

 

    1. En este caso utilizaremos un Stored Procedure ya existente con el siguiente código.

   

ALTER PROCEDURE dbo.GetOneAuthor

(

       @au_id varchar(11) =

)

AS

       SELECT     au_id, au_lname, au_fname, phone,

                          address, city, state, zip, contract

       FROM         authors

       WHERE     (au_id = @au_id)

       RETURN

   

   

 

 

  1. Dentro del asistente de creación seleccionamos el procedimiento y completamos el nombre del mismo en la opción para generar los 2 tipos de funciones (Fill y GetData)

 

  1. El resultado final en el diseñador queda así:

   

 

 

 

Utilizando este mismo procedimiento, podemos optar por que el asistente cree automáticamente los accesos para el SELECT, UPDATE y DELETE con la tabla con la que estamos trabajando. En este caso, debemos tener cuidado ya que en el caso de la tabla authors, la generación automatica no reconoce algunos tipos de datos de la base de datos. El store procedure que se genera para la eliminación de un registro es el siguiente

   

   

CREATE PROCEDURE dbo.DeleteQuery

(

       @Original_au_id id,

       @Original_au_lname varchar(40),

       @Original_au_fname varchar(20),

       @Original_phone char(12),

       @IsNull_address unknown,

       @Original_address varchar(40),

       @IsNull_city unknown,

       @Original_city varchar(20),

       @IsNull_state unknown,

       @Original_state char(2),

       @IsNull_zip unknown,

       @Original_zip char(5),

       @Original_contract bit

)

AS

       SET NOCOUNT OFF;

DELETE FROM [dbo].[authors] WHERE (([au_id] = @Original_au_id) AND ([au_lname] = @Original_au_lname) AND ([au_fname] = @Original_au_fname) AND ([phone] = @Original_phone) AND ((@IsNull_address = 1 AND [address] IS NULL) OR ([address] = @Original_address)) AND ((@IsNull_city = 1 AND [city] IS NULL) OR ([city] = @Original_city)) AND ((@IsNull_state = 1 AND [state] IS NULL) OR ([state] = @Original_state)) AND ((@IsNull_zip = 1 AND [zip] IS NULL) OR ([zip] = @Original_zip)) AND ([contract] = @Original_contract))

   

   

Nota: en los parámetros, IsNull_address, IsNull_city, etc, el tipo de dato que se especifica para los mismos es unknown, por lo que este SP no se registra en la base de datos.

   

Desde aquí ya los pasos siguientes son los más simples y la verdad es que el resultado final es asombroso. Una vez que tenemos configurado nuestro DataSet con sus procedimientos que representan nuestra capa de datos, podemos utilizarlos desde nuestra aplicación.

   

Por ejemplo, si deseamos asociar a una DataGridView el resultado de la búsqueda de un autor, lo podemos hacer de la siguiente manera:

   

‘ define auid and create TableAdapter

Dim Au_Id As String = "172-32-1176"

Dim auth As New SampleTableAdapter.PubsTableAdapters.authorsTableAdapter

   

‘ get and display data

Me.DataGridView1.DataSource = auth.GetDataByAu_Id(Au_Id)

   

   

Este ejemplo, demuestra como en un par de minutos podemos crear una pequeña aplicación y definir una clase de acceso a datos en la misma. Sin embargo, un punto débil que tenían los generadores de código hasta este momento, era que en los mismos se quedaba “pegada” la cadena de conexión a la base de datos con la que se generaron los componentes. En este caso, podemos modificar esta configuración desde el archivo de configuración de la aplicación en su sección de conexiones, por ejemplo:

   

    <connectionStrings>

        <add name="SampleTableAdapter.My.MySettings.pubsConnectionString"

            connectionString="Data Source=.;Initial Catalog=pubs;Persist Security Info=True;User ID=123;Password=123"

            providerName="System.Data.SqlClient" />

    </connectionStrings>

   

   

La verdad es para pequeñas demos y aplicaciones simples, funciona de maravilla. Nunca debemos olvidar que una arquitectura más robusta debe pensar en un ejemplo, que utilice un Framework para la creación de aplicaciones, como por ejemplo Enterprise Library. Pero para un pequeño paso a paso en .Net, es interesante.

   

Saludos

 

 

PD: Pueden encontrar mas informacion en http://www.microsoft.com/spanish/msdn/articulos/archivo/141105/voices/tableadapters.mspx