VB .NET - Populando o controle TreeView com tabelas e colunas do SQL Server


Em meu artigo VB .NET - Populando o controle TreeView com tabelas e colunas do MS Access mostrei como preencher o controle TreeView com tabelas e colunas de um banco de dados MS Access. Chegou a hora de fazer a mesma coisa com o SQL Server.

Eu vou duas opções de para realizar esta tarefa; uma usado uma consulta SQL e a outra obtendo as informações de um arquivo XML através da classe XMLDataDocument.

Abra o Visual Basic 2010 Express Edition e clique em New Project e selecione o template Windows Forms Application informando o nome Tvw_SQLServer e clique em OK;

No formulário form1.vb do projeto inclua a partir da ToolBox um controle TreeView (name=tvwDados) e um controle ImageList (name= Imgl);

A seguir no controle ImageList clique na propriedade Images e inclua 3 imagens que serão usadas para diferenciar níveis dos nós do controle TreeView visto que teremos três níveis de nós (nodes) : root, tabelas e colunas

Para isso utilize a janela do Images Collection Editor, e clicando no botão Add inclua 3 imagens a seu gosto conforme a figura abaixo:

A seguir no controle TreeView atribua à propriedade ImageList o nome Imgl do controle acima;

Vamos incluir também 4 controles controles Buttons, 1 controle Label e um controle OpenFileDialog no formulário fom1.vb :

Conforme o leiaute da figura abaixo:

Definindo o código do projeto

1- O namespace usado no formulário para acessar as classes do provedor para o SQL Server

Imports System.Data.SqlClient

No início do formulário vamos definir a variável nomeArquivo que irá receber o nome do arquivo SQL Server;

Dim nomeArquivo As String

2- Código do evento Click do botão Exibir:

   Private Sub btnPopular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPopular.Click

        Dim arquivoSQLServer As OpenFileDialog = New OpenFileDialog()
        arquivoSQLServer.InitialDirectory = "c:\dados\"
        Dim caminho As DialogResult
        Dim caminhoArquivo As String
      
        arquivoSQLServer.Title = "Escolher Arquivo"
        arquivoSQLServer.FileName = "Nome Arquivo"
        arquivoSQLServer.Filter = "Arquivos SQL Server (*.mdf)|*.mdf"
        caminho = arquivoSQLServer.ShowDialog
        caminhoArquivo = arquivoSQLServer.FileName

        If caminhoArquivo = Nothing Then
            MessageBox.Show("Arquivo Invalido", "Abrir Arquivo", MessageBoxButtons.OK)
        Else
            nomeArquivo = Path.GetFileName(caminhoArquivo)
            popularTreeView(nomeArquivo.Replace(".MDF", ""))
            btnRetrair.Enabled = True
            btnExpandir.Enabled = True
        End If
    End Sub

O código define algumas propriedades do controle OpenFIleDialog e chama a rotina popularTreeview passando o caminho do arquivo selecionado.

- InitialDirectory - Representa o diretório a ser exibido quando a janela de diálogo aparecer pela primeira vez.
- Title - Usada para definir ou atribuir um título a janela de diálogo;
- Filter - Representa o filtro da janela de diálogo que será usado para filtrar o tipo de arquivos a serem carregados durante a localização.
- FileName - Representa o nome do arquivo selecionado na janela de diálogo.

Naturalmente você terá que permissão para acessar o SQL Server.

O código da rotina popularTreeView() é mostrada a seguir:

 Private Sub popularTreeView(ByVal DBSQLServer As String)

        'define os objetos ADO .NET para acessar o SQL Server
        Dim conexaoSQLServer As SqlConnection = Nothing
        Dim cmd As SqlCommand
        Dim da As New SqlDataAdapter
        Dim ds As New DataSet

        'define a string de conexão
        Dim strCon As String = "Data Source= .\SQLEXPRESS;Initial Catalog=" & DBSQLServer & ";Integrated Security=True"

        'define a consulta para obter as tabelas e suas colunas
        Dim sqlConsulta As String = "SELECT TABLE_NAME, COLUMN_NAME " +
                                                   "FROM information_schema.columns " +
                                                   "ORDER BY TABLE_NAME, COLUMN_NAME"

        'define os nodes que iremos usar no treeview
        Dim NoRaiz As TreeNode = Nothing
        Dim NoPrincipal As TreeNode = Nothing
        Dim NoFilho As TreeNode = Nothing

        'define algumas constanes e variaveis usadas
        Dim nomePrincipal As String = String.Empty
        Dim nomeFilho As String = String.Empty
        Dim BancoDados As String = DBSQLServer

        Try
            'define e abre a conexão com o SQL Server
            conexaoSQLServer = New SqlConnection(strCon)
            conexaoSQLServer.Open()

            'atribui o comando usado na conexão
            cmd = New SqlCommand(sqlConsulta, conexaoSQLServer)
            da.SelectCommand = cmd

            'preenche o dataset
            da.Fill(ds, "Dados_Sistema")

            tvwDados.Nodes.Clear()
            'inclui o node raiz
            NoRaiz = tvwDados.Nodes.Add(key:="Root", text:=BancoDados, imageIndex:=0, selectedImageIndex:=0)

            Dim contaTabelas as Integer
            For Each row As DataRow In ds.Tables("Dados_Sistema").Rows

                If nomePrincipal <> row(0).ToString Then
                    NoPrincipal = NoRaiz.Nodes.Add(key:="Table", text:=row(0).ToString, imageIndex:=1, selectedImageIndex:=1)
                    nomePrincipal = row(0).ToString
                    contaTabelas += 1
                End If
                 'define os nós filhos
                NoFilho = NoPrincipal.Nodes.Add(key:="Column", text:=row(1).ToString, imageIndex:=2, selectedImageIndex:=2)

            Next

            lblTabelas.Text = contaTabelas.ToString & " Tabelas no arquivo"
            tvwDados.Nodes(0).EnsureVisible()

        Catch ex As Exception
            MessageBox.Show("Erro ao realizar a operação com o arquivo : " & ex.Message)
            Exit Sub
        Finally
            'libera os recursos da conexão usada
            conexaoSQLServer.Close()
            conexaoSQLServer.Dispose()
            conexaoSQLServer = Nothing
        End Try

    End Sub

A consulta SQL usada para retornar as tabelas e suas colunas usa a view INFORMATION_SCHEMA.COLUMNS para obter o nome das tabelas e colunas do SQL Server.

Esta view contém uma linha para cada coluna acessíveis para o usuário atual no banco de dados atual. A view INFORMATION_SCHEMA.COLUMNS é baseada nas tabelas do sistema nosysobjects, type_info spt_data, systypes, syscolumns, syscomments, sysconfigures e syscharsets.

Abaixo vemos o resultado da consulta executada no SQL Server Management Studio:

Vamos usar esta view para obter as tabelas e consultas do banco de dados.

O código do evento Click do botão Expandir

Private Sub btnExpandir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExpandir.Click
        'expande todos os nós
        tvwDados.ExpandAll()
    End Sub 

O método ExpandAll() expande todos os nodes.

O código do evento Click do botão Retrair

Private Sub btnRetrair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRetrair.Click
        'retrai todos os nós
        tvwDados.CollapseAll()
    End Sub

O método CollapseAll() retrai todos os nodes.

O código do evento Click do botão Sair

 Private Sub btnSair_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSair.Click
        Dim resultado As DialogResult = MessageBox.Show("Deseja encerrar a aplicação ?", _
             "Encerrar", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)

        If resultado = DialogResult.Yes Then
            Application.Exit()
        End If

    End Sub

Executando o projeto ao clicar no botão Exibir teremos a caixa de diálogo Abrir arquivo aberta para selecionarmos o arquivo SQL Server:

Após selecionar o arquivo o controle é preenchido com os nomes das tabelas e suas colunas:

Para obter o nó selecionado no controle TreeView usamos o evento AfterSelect pois o evento Click do controle retorna apenas o nó anterior selecionado.

No código usamos as propriedades e.Node e SelectedNode para obter o nó selecionado.

    Private Sub tvwDados_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles tvwDados.AfterSelect

        'obtem o item selecionado
        Dim itemSelecionado As String = tvwDados.SelectedNode.ToString
        'remove a string TreeNode
        itemSelecionado = itemSelecionado.Replace("TreeNode: ", "")

        'verifica se o item é nulo
        If (e.Node.Parent IsNot Nothing) Then
            'verifica o tipo do no
            If (e.Node.Parent.GetType() Is GetType(TreeNode)) Then
                If e.Node.Parent.Text = nomeArquivo Then
                    'mostra o nome da tabela e da coluna selecionada
                    MessageBox.Show(e.Node.Parent.Text + "." + itemSelecionado)
                Else
                    'mostra so o nome da tabela
                    MessageBox.Show(itemSelecionado)
                End If

            End If
        End If

    End Sub

Executando o projeto e selecionando um nó com o mouse iremos obter :

Pegue projeto completo aqui: Tvw_SQLServer.zip

Marcos 6:10 Dizia-lhes mais: Onde quer que entrardes numa casa, ficai nela até sairdes daquele lugar.
Marcos 6:11
E se qualquer lugar não vos receber, nem os homens vos ouvirem, saindo dali, sacudi o pó que estiver debaixo dos vossos pés, em testemunho contra eles.

Referências:


José Carlos Macoratti