Visualizador genérico para SQL Server
A figura exibe o resultado final do projeto que irei abordar neste artigo. O projeto é um visualizador genérico para SQL Server. Com ele podemos exibir os dados das tabelas de um banco de dados contido no SQL Server.
Funciona assim :
Informamos o nome do banco de dados
Clicamos a seguir no botão - Exibir Tabelas - para que todas as tabelas presente no banco de dados sejam exibidas na combobox
A string de conexão é montada automaticamente no formato : Select * from Nome_da_Tabela
Clicamos no botão - Exibir Dados - para exibir os dados da tabela selecionada na combobox em um controle ListView.
O projeto não é muito complexo , e , você pode expandir muitas das funcionalidades aqui definidas. Na construção deste projeto você vai aprender a realizar as seguintes tarefas:
criar uma conexão com um banco de dados SQL Server
Usar os objetos DataSet , DataTable e DataColumn
Usar o controle Listview para exibir dados
Agora vamos ao trabalho...
Crie um projeto no Visual Studio .NET do tipo Windows Application com o nome de VisualizaBD (ou outro nome de sua preferência) e no formulário padrão insira os controles : 3 TextBox , 3 Labels , 3 Buttons e 1 controle ListView. Conforme layout acima.
Inclua no seu projeto um módulo através do menu Project|Add Module - Template - Module. Altere o nome do modulo para VisualizaBD.vb , e inclua as seguinte linhas de código no início do Módulo:
Imports System.Data.SqlClient
Module VisualizaBD ' a palavra chave Friend torna os elementos declardos acessíveis a partir do programa' que contém a declaração e a partir de qualquer ponto dentro da mesma assembly Friend con As SqlConnection 'definindo o objeto Connection para conexao com o bd Friend dtb As DataTable 'definindo o objeto datatable Friend dst As DataSet 'definindo o objeto dataset Friend dap As SqlDataAdapter 'definindo o objeto dataadapter Friend sql As String 'a string com o comando SQL para selecionar os dados Friend strcon As String 'a string de conexao para conexao com o bd Friend NomeTabela As String = "Agenda" 'o nome da tabela ... |
-
Como vou acessar uma base SQL Server estou usando o namespace - SqlClient As variáveis definidas para serem visíveis no projeto são definidas no módulo - As rotinas e funções que iremos usar no projeto também serão definidas no módulo. |
Vamos agora voltar para o formulário da aplicação - form1.vb - e , no evento Load definir o seguinte código :
Private
Sub form1_Load(ByVal
sender As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load
'define como padrão a conexao com o banco de
dados Teste do SQL Server Local
'voce deve ter o SLQ server instalado em sua
máquina ou acessá-lo no servidor alterando a string abaixo
'Para uma conexão Access use um provedor
OLEDB como :"Provider=Microsoft.Jet.OLEDB.4.0;DataSource="
Me.txtBD.Text = "Teste" Me.txtstrsql.Text = "Select * from Clientes"
strcon = "server=(local);Trusted_Connection=yes;database=" & Me.txtBD.Text 'vamos configurar o ListView With lstvwBD.View = View.Details 'exibe cada item separado em colunas.FullRowSelect = True 'permite a seleção de linha.GridLines = True 'exibe as linhas de grade do controle.LabelEdit = True 'não permite ao usuário alterar as labels dos itens End With
cbotabelas.Text = "" 'limpa o texto da combobox que vai exibir as tabelas End Sub |
-
txtBD é o nome da caixa de texto indicando o banco de dados usado - txtstrsql - é o nome da string SQL para selecionar os dados da tabela - strcon = é a string de conexão usada para acessar o servidor SQL Server - lstvwBD - é o nome do controle ListView - cbotabelas - é o nome dado a combobox. |
Pois bem , a esta altura se você executar o programa vai obter a seguinte tela:
- Ela exibe o nome do
banco de dados Teste e a string SQL - Select *
from Clientes
- Clientes é uma tabela do banco de dados teste. - Para prosseguir e preencher a caixa de combinação com todas as tabelas do banco de dados teste devemos clicar no botão - Exibir Tabelas. - Vejamos o seu código a seguir: |
Código relacionado ao evento Click do botão - Exibir Tabelas :
Private Sub btnExibirTabelas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExibirTabelas.ClickDim nome_Tabelas() As String Dim i As Integer
nome_Tabelas = NomeTabelas()
cbotabelas.Items.Clear() If Not cbotabelas Is Nothing Then For i = 0 To nome_Tabelas.Length - 1cbotabelas.Items.Add(nome_Tabelas(i)) Next End If If cbotabelas.Items.Count > 0 Then cbotabelas.SelectedIndex = 0 End If End Sub |
Neste código temos a sequência de código:
a definição de um vetor (array) nome_Tabelas() onde eu vou guardar o nome das tabelas do database
Chamo a função NomeTabelas() que irá retornar o nome das tabelas
limpo a combobox - cbotabelas.Items.Clear
Se não houver nada na combo então eu percorro o vetor nome_tabelas e incluo o nome da tabela na combo
If Not cbotabelas Is Nothing Then
For i = 0 To nome_Tabelas.Length - 1cbotabelas.Items.Add(nome_Tabelas(i))
Next End If
Por último verifico se há itens na combo e , em caso positivo, seleciono o primeiro item da mesma.
If cbotabelas.Items.Count > 0 Then
cbotabelas.SelectedIndex = 0
End IfEsta na hora de vermos o código do módulo visualizaBD.vb que contém além da função NomeTabelas() as demais funções que iremos usar no projeto. O código já esta comentado:
Module VisualizaBD ' a palavra chave Friend torna os elementos declardos acessíveis a partir do programa ' que contém a declaração e a partir de qualquer ponto dentro da mesma assembly Friend con As SqlConnection 'definindo o objeto Connection para conexao com o bd Friend dtb As DataTable 'definindo o objeto datatable Friend dst As DataSet 'definindo o objeto dataset Friend dap As SqlDataAdapter 'definindo o objeto dataadapter Friend sql As String 'a string com o comando SQL para selecionar os dados Friend strcon As String 'a string de conexao para conexao com o bd Friend NomeTabela As String = "Agenda" 'o nome da tabela Friend Sub ConexaoBD(Optional ByVal NomeBancoDados As String = "", Optional ByVal sqlstring As String = "")
If NomeBancoDados = "" Then MessageBox.Show("Informe o nome da base de dados.") Exit Sub End If 'se a string sql estiver vazia atribui um valor padrao If sql = "" Thensql = "Select * from Tabela" End If 'se o parametro passado para a funcao estiver vazio atribui o padrao If sqlstring = "" Thensqlstring = sql End If
sql = sqlstring 'se a string de conexao estiver vazia atribui o valor padrão If strcon = "" Thenstrcon = "server=(local);Trusted_Connection=yes;database=" & NomeBancoDados End If 'cria uma nova conexao , se houver erro exibe o erro e seu numero Trycon = New SqlConnection(strcon) Catch ex As ExceptionMessageBox.Show("Erro ao realizar a conexao: " & vbCrLf & ex.Message & vbCrLf & " Erro numero: " & Err.Number) Exit Sub End Try 'abre a conexao e cria os objetos dataset e dataadapter con.Open()
dst = New DataSet()dap = New SqlDataAdapter(sql, con) 'a classe Sqlcommandbuilder gera automaticamente comandos para 'feitas no dataset com o SQL Server sincronizar as mudanças Dim commandbuilder As New SqlCommandBuilder(dap) 'define a acão a ser tomada quando incluimos dados no dataset e o datatable 'ou o datacolum estiver faltando. 'addwithkey inclui as colunas necessárias e a informação sobre a chave primaria 'completa para o esquemadap.MissingSchemaAction = MissingSchemaAction.AddWithKey 'preenche o dataset e se houver erro exibe a mensagem e o numero do erro Trydap.Fill(dst, NomeTabela) Catch ex As ExceptionMessageBox.Show("Erro ao preencher o DataSet." & vbCrLf & ex.Message & vbCrLf & " Erro numero: " & Err.Number) Exit Sub End Try End Sub Friend Function NomeTabelas(Optional ByVal nomeBancoDados As String = "") As String() 'define as variáveis usadas na funcao Dim nome_Tabelas() As String Dim dtTable As New DataTable() Dim i As Integer 'verifica se a conexão esta ativa If con Is Nothing Then con = New SqlConnection(strcon) End If'verifica se a conexao esta aberta If con.State <> ConnectionState.Open Then con.Open() End If'retorna o schema para a tabela na base de dados Dim schemaDA As New Data.SqlClient.SqlDataAdapter( "SELECT * FROM INFORMATION_SCHEMA.TABLES " & _ "WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_TYPE", con) 'preenche o esquema com os dados schemaDA.Fill(dtTable) i = dtTable.Rows.Count - 1 If i > -1 Then ReDim nome_Tabelas(i)'preenche o vetor com o nome das tabelas For i = 0 To dtTable.Rows.Count - 1 nome_Tabelas(i) = dtTable.Rows(i).Item("TABLE_NAME").ToString() Next End If ' Return nome_Tabelas End Function Friend Function NomeColunas(ByVal connectionString As String, ByVal selectCommandText As String ) As String() Dim coluna As Data.DataColumn Dim i, j As Integer Dim nomeCol() As String ' 'verifica quantas colunas a tabela possui j = dst.Tables(NomeTabela).Columns.Count - 1 'refaz o vetor com a quantidade de colunas da tabela ReDim nomeCol(j) 'preenche o vetor com o nome de cada coluna For i = 0 To jcoluna = dst.Tables(NomeTabela).Columns(i) nomeCol(i) = coluna.ColumnName Next 'retorna o nome das colunas do registro Return nomeCol
End Function Friend Sub DefinirCabecalho(ByVal ListView1 As ListView, ByVal cboCampos As ComboBox) Dim i As Integer ' 'chama a função definir cabecalho DefinirCabecalho(ListView1) 'limpa o comboboxcboCampos.Items.Clear() 'preenche o combo box com o nome das colunas For i = 0 To ListView1.Columns.Count - 1cboCampos.Items.Add(ListView1.Columns(i).Text) Next 'define o primeiro valor da combo como selecionado If cboCampos.Items.Count > 0 ThencboCampos.SelectedIndex = 0 End If End Sub 'Friend Sub DefinirCabecalho(ByVal ListView1 As ListView) Dim coluna As Data.DataColumn Dim i, j As Integer 'define os valores para o listview With ListView1 .View = View.Details .FullRowSelect = True.GridLines = True.LabelEdit = False.HideSelection = False.Columns.Clear() End With'pega o nome das colunas da tabela Dim Colunas() As String Colunas = NomeColunas(strcon, sql) 'ajusta o alinhamento das colunas no listview If Not Colunas Is Nothing Then For i = 0 To Colunas.Length - 1ListView1.Columns.Add(Colunas(i), 100, HorizontalAlignment.Left) Next End If ' End Sub Friend Sub CarregarLista(ByVal ListView As ListView) Dim i As Integer Dim lwItem As ListViewItem Dim registro As Data.DataRow
'limpa o controle listview ListView.Items.Clear() 'percorre o registro da tabela e exibe os valores no controle For Each registro In dst.Tables(NomeTabela).Rows For i = 0 To ListView.Columns.Count - 1 If i = 0 Then lwItem = ListView.Items.Add(registro(i).ToString) lwItem.Tag = registro Else lwItem.SubItems.Add(registro(i).ToString) End If Next Next ' End Sub
End Module
|
Bem , após a combo ser preenchida , podemos escolher uma tabela para exibir os seus dados. Fazemos isto clicando no botão - Exibir Dados . O código associado ao seu evento Click é o seguinte :
Private
Sub
btnExibirDados_Click(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
btnExibirDados.Click
'
With lstvwBD
.View = View.Details .FullRowSelect = True.GridLines = True.LabelEdit = False.HideSelection = False.Columns.Clear() End With ' ' Volta a fazer a conexao para atualizar os dados If Not con Is Nothing Thencon.Close() End If'NomeTabela = cbotabelas.Text ConexaoBD(txtBD.Text, txtstrsql.Text) 'DefinirCabecalho(lstvwBD) CarregarLista(lstvwBD) End Sub
|
Para encerrar temos o código associado ao evento Closing do formulário.
Private Sub form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 'antes de fechar a conexão verifica o estado da mesma 'se estiver aberta então fecha 'se houver erro , captura e exibe a mensagem e o numero do erro TryIf con.State = ConnectionState.Open Then con.Close() End IfCatch ex As Exception If Err.Number = 91 Then MessageBox.Show("Encerrando a aplicação!") Else MessageBox.Show("Erro ao fechar conexão. " & vbCrLf & ex.Message & vbCrLf & " Erro numero : " & Err.Number) End If End End Try End Sub |
Executando a aplicação teremos:
Até mais ver...
José Carlos Macoratti