Conservar nombres de tablas múltiples al popular un DataSet tipado

 

Fecha: 18/Ene/2005 (17/01/05)
Autor: Lucas Quevedo Stinson, lucasq@gmail.com

 


Supongamos que tenemos un procedimiento almacenado con varias consultas, cada una de las cuales deberá popular una tabla de un DataSet tipado.

Al utilizar el método Fill del objeto DataAdapter, nos encontramos con que es complicado determinar qué tabla del DataSet se populó con cada una de las consultas. El método Fill tiene una sobrecarga que permite especificar el nombre de la tabla que desea popularse, pero ¿qué debemos hacer cuando deseamos popular m ás de una tabla?. No existe ninguna sobrecarga del método Fill que nos permita hacer eso.

Resulta ser que nuestro querido DataAdapter utiliza el siguiente criterio para popular tablas múltiples: al resultado de la primera consulta del procedimiento almacenado, lo asocia con el nombre de tabla que le especificamos en la sobrecarga, y a los resultados de las consultas subsiguientes intenta asociarlos con el mismo nombre de tabla original con un sufijo numérico incremental.

Veamos un ejemplo. Supongamos que en la base de datos Northwind tenemos un procedimiento almacenado denominado Orders_GetOne, que devuelve los datos de una orden. Este procedimiento almacenado contiene dos consultas: una para devolver el encabezado del documento, y otra para devolver los productos que componen el detalle del mismo.

CREATE PROCEDURE Orders_GetOne

         @OrderId AS INT

AS

 

SET NOCOUNT ON

 

SELECT         *

FROM          Orders

WHERE         OrderId = @OrderId

 

SELECT         Products.*

FROM          Products

INNER JOIN         "Order Details"

ON              Products.ProductId = "Order Details".ProductId

WHERE         "Order Details".OrderId = @OrderId

 

GO

 

 

Cuando en nuestro código hagamos...

da.Fill(ds, "Orders")

…la primera consulta del procedimiento almacenado llenará la tabla “Orders”, mientras que la segunda buscará llenar la tabla “Orders1”, y así sucesivamente para casos con más consultas.

De esta forma, el artilugio para popular nuestras tablas consiste en renombrarlas temporalmente para que la ejecución del método Fill las popule a conveniencia, y, una vez populado nuestro DataSet, restaurar los nombres originales de las tablas.

El método de obtención de datos podría ser algo como sigue:

 

Private Function ObtenerDatos(ByVal OrderId As Integer, ByVal NombreTabla As String) As dsOrder

 

        Dim cnn As New SqlConnection(CNN_STRING)

        Dim cmd As New SqlCommand("Orders_GetOne", cnn)

        cmd.CommandType = CommandType.StoredProcedure

        cmd.Parameters.Add("@OrderId", OrderId)

 

        Dim ds As New dsOrder

        Dim i As Integer

        'colección para conservar los nombres originales de las tablas

        Dim oArray As New Collections.ArrayList

        If ds.Tables.Count > 1 Then

            For i = 1 To ds.Tables.Count - 1

                oArray.Add(ds.Tables(i).TableName)

                ds.Tables(i).TableName = NombreTabla & i

            Next

        End If

 

        Dim da As New SqlDataAdapter(cmd)

        da.Fill(ds, "Orders")

 

        'restauro los nombres de las tablas

        If ds.Tables.Count > 1 Then

            For i = 1 To ds.Tables.Count - 1

                ds.Tables(i).TableName = Convert.ToString(oArray(i - 1))

            Next

        End If

 

        Return ds

 

    End Function

 

 

De esta forma, podremos hacer referencia a los nombres de las tablas del DataSet tipado. Por ejemplo:

 

        Dim ds As New dsOrder

        ds = ObtenerDatos(OrderId, "Orders")

 

        dgOrders.DataSource = ds

        dgOrders.DataMember = "Orders"

 

        dgProducts.DataSource = ds

        dgProducts.DataMember = "Products"

 

 

Adjunto un proyecto de ejemplo con todo el código visto.

 


 

ir al índice

Fichero con el código de ejemplo: lqstinson_ConservarNombres_enDataSet_Tipado.zip - 15.2 KB