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.Referências: