Poblar un DataSet de múltiples tablas con sus respectivos nombres
Mecanismo para obtener un DataSet de múltiples tablas con sus respectivos nombres desde un Store Procedure que devuelve una colección con los nombres de cada una de las consultas para luego asignarlas a cada DataTable del DataSet.

Fecha: 23/Ene/2005 (21/Ene/05)
Autor: Serge Valsse (svalsse@hotmail.com)

 


Hace unos días se publicó en este mismo sitio una forma muy interesante de obtener un resultado muy parecido al planteado en este artículo, la diferencia en este caso es que no estaremos utilizando un DataSet tipado lo que amplia su funcionalidad.

La idea es la siguiente, en los Store Procedure que utilizaremos para este fin debemos enviar siempre como última consulta un la colección de los nombres que le daremos a cada una de las consultas que están siendo generadas. Por ejemplo:

CREATE PROCEDURE order_select_all

AS

SELECT * FROM Orders

SELECT * FROM Products

SELECT table_key = 'collection', tables_collection = 'Orders;Products'

GO

La convención que estoy utilizando es que la última consulta debe contener dos campos descritos a continuación:

table_key: debe contener la palabra "collection" ya que dentro de la lógica utilizada en el programa que ya veremos, busca este valor para reconocer que se trata de los nombres de las consultas anteriores.

tables_collection: se debe especificar un string que contiene el nombre que queremos asignarle a cada una de las consultas en el orden definido en el store procedure, además deben estar separadas por punto y coma (;), esto por convención utilizada en la lógica del programa y no debe contener una descripción para ella misma.

Veamos ahora como sería el código. Supongamos que tenemos un formulario que contiene dos DataGrid uno para mostrar las ordenes y otra para mostrar los productos, además un botón que ejecuta el método que llena los DataGrid.

Figura 1. Ejemplo de la consulta del DataSet.



En el evento Click del botón que manda a ejecutar el procedimiento:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ds As New DataSet

    ds = ObtenerDatos("Orders")

    dgOrders.DataSource = ds
    dgOrders.DataMember = "Orders"

    dgProducts.DataSource = ds
    dgProducts.DataMember = "Products"
End Sub

Este es el método que verifica que en la última consulta del Store Procedure contenga el string con la colección de nombres de tabla que deseamos asignar. Además considera el caso que el Store Procedure no tenga la convención requerida (es decir que no tengo una última consulta con los nombres de las tablas), para este caso pues el DataAdaptarer usará su forma normal de nombrar los DataTables.

Private Function ObtenerDatos(ByVal NombreTabla As String) As DataSet

    Dim cnn As New SqlConnection("server=(local);Integrated Security = true;Initial Catalog=NorthWind")
    Dim cmd As New SqlCommand(NombreTabla + "_select_all", cnn)
    cmd.CommandType = CommandType.StoredProcedure

    Dim ds As New DataSet
    Dim i As Integer

    Dim da As New SqlDataAdapter(cmd)
    da.Fill(ds, "Orders")

    Dim oArray() As String

    If ds.Tables.Count > 1 Then
        If ds.Tables(ds.Tables.Count - 1).Rows(0).ItemArray(0).ToString() = "collection" Then
            oArray = Split(ds.Tables(ds.Tables.Count - 1).Rows(0).ItemArray(1).ToString(), ";")
            For i = 0 To ds.Tables.Count - 2
                ds.Tables(i).TableName = oArray(i).ToString()
            Next
        End If
    End If

    Return ds

End Function

Por favor no olvides calificar este documento en la caja de PanoramaBox que se muestra al inicio de la página.



Serge Valsse
svalsse@hotmail.com


 


ir al índice