Poblar un DataSet de múltiples tablas con sus respectivos nombres
Fecha: 23/Ene/2005 (21/Ene/05)
|
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 SubEste 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 FunctionPor favor no olvides calificar este documento en la caja de PanoramaBox que se muestra al inicio de la página.
Serge Valsse
[email protected]