none
Obtener esquema de una consulta Sql en .Net. RRS feed

  • Pregunta

  • Hola compañeros.

    Mi pregunta es la siguiente:

    Tengo una consulta sql que retorna datos de 2 tablas mediante una union(JOIN), lo que deseo hacer es ejecutar esta consulta y obtener el esquema, es decir, Las tablas de la consulta con sus respectivos campos.

    Por ejemplo si tengo un SELECT que trae datos de las Tablas Clientes y proveedores.

    Que me traiga el esquema de la consulta especificando los campos que se retorno en la consulta y la tabla(ya sea Clientes o proveedores) a la que pertenece. Esto con el objetivo de listar estas tablas con sus campos en un combobox y hacer un filtro para un reporte dinamico.

    El metodo GetSchema solo devuelve los metadatos de una tabla.

    muchas gracias.


    lunes, 8 de agosto de 2011 20:20

Respuestas

  • "Mariande" preguntó:

    > Tengo una consulta sql que retorna datos de 2 tablas mediante
    > una union(JOIN), lo que deseo hacer es ejecutar esta consulta
    > y obtener el esquema, es decir, Las tablas de la consulta con
    > sus respectivos campos.

    Hola:

    Con una consulta JOIN, me parece a mí que va a ser complicado hacer lo que creo haber entendido que deseas hacer, porque lo único que podrías obtener es un único objeto DataTable con la ESTRUCTURA CONJUNTA de las dos tablas, pero no vas a saber a qué tabla pertence cada campo.

    Si por "consulta Sql en .NET" entendemos que estás utilizando una base de datos de Microsoft SQL Server, y siempre y cuando tu preocupación sea obtener únicamente el esquema de varias tablas, la solución se encuentra en rellenar un objeto DataSet como resultado de ejecutar una consulta SQL que devuelva múltiples resultados, que desde luego, no van a estar combinados. Para que una consulta devuelva varios resultados, las consultas T-SQL de selección individuales tienen que estar seraparadas por un punto y coma.

    Si deseas probarlo para ver si cumple con lo que requieres, te puede resultar útil la siguiente función:

      Private Function GetData(tableName1 As String, tableName2 As String) As DataSet
    
        Try
          Using cnn As New SqlConnection(connString)
    
            Dim sql As String = String.Format( _
              "SELECT * FROM {0};" & _
              "SELECT * FROM {1}", tableName1, tableName2)
    
            Dim da As New SqlDataAdapter(sql, cnn)
    
            Dim ds As New DataSet("NombreDataSet")
    
            ' Rellenamos únicamente las estructuras de las tablas
            '
            da.FillSchema(ds, SchemaType.Source)
    
            ' Cambiamos el nombre de los objetos DataTable
            '
            ds.Tables(0).TableName = tableName1
            ds.Tables(1).TableName = tableName2
    
            ' Devolvemos el objeto DataSet
            '
            Return ds
    
          End Using
    
        Catch ex As Exception
          Throw
    
        End Try
    
      End Function
    

    He utilizado el método FillSchema del objeto DataAdapter porque dices que solamente deseas el esquema de la tabla. Si también deseas los datos, entonces utiliza el método Fill.

    Y llamarías a la función de la siguiente manera:

      Private m_ds As DataSet = Nothing
    
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        ' Instalamos el controlador para el evento SelectedIndexChanged
        ' del control ComboBox.
        '
        AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBoxOnSelectedIndexChanged
    
        Try
          ' Obtenemos el objeto DataSet con los datos de las
          ' dos tablas.
          '
          m_ds = GetData("Clientes", "Proveedores")
    
          ' Añadimos los nombres de las tablas al control ComboBox
          '
          With ComboBox1.Items
            .Add(m_ds.Tables(0).TableName)
            .Add(m_ds.Tables(1).TableName)
          End With
    
          ' Seleccionamos el primer elemento
          '
          ComboBox1.SelectedIndex = 0
    
        Catch ex As Exception
          MessageBox.Show(ex.Message)
    
        End Try
    
      End Sub
    
      Private Sub ComboBoxOnSelectedIndexChanged(sender As Object, e As EventArgs)
    
        ' Mostramos la estructura de la tabla seleccionada
        ' en un control DataGridView.
        '
        DataGridView1.DataSource = m_ds.Tables(ComboBox1.Text)
    
      End Sub
    

    He añadido los nombres de las tablas existentes en el objeto DataSet a un control ComboBox, y aprovechamos su evento SelectedIndexChanged para obtener el esquema de la tabla seleccionada y mostrar su estructura en un control DataGridView.

    Por ahora no se me ocurre otra cosa que puedas hacer.

    Un saludo


    Enrique Martínez
      [MS MVP - VB]

    lunes, 8 de agosto de 2011 21:49
    Moderador