VB.NET – Populando o controle TreeView com tabelas e colunas do SQL Server
Eu sugiro duas opções para realizar esta tarefa: uma usando 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, 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 três imagens que serão usadas para diferenciar os 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 três 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, quatro controles Buttons, um Label e um OpenFileDialog no formulário fom1.vb:
- btnPopular – Preenche o controle TreeView com os dados;
- btnRetrair – Retrai todos os nós da árvore;
- btnExpandir – Expande todos os nós da árvore;
- btnSair – Encerra a aplicação;
- OpenFileDialog – name= ofd1 – Exibe a caixa de diálogo “Abrir arquivo” para selecionar o arquivo .mdf;
- Label = lblTabelas – Exibe a quantidade de tabelas no banco de dados.
Conforme o layout da figura abaixo:
Definindo o código do projeto
- 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.
- 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 que serão carregados durante a localização;
- FileName – Representa o nome do arquivo selecionado na janela de diálogo.
Naturalmente, você terá que pedir permissão para acessar o SQL Server. O código da rotina popularTreeView() é mostrado 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.
Essa view contém uma linha para cada coluna acessível para o atual usuário 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 essa view para obter as tabelas e as 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, nós 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 :