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 :

  1. Informamos o nome do banco de dados

  2. Clicamos a seguir no botão - Exibir Tabelas - para que todas as tabelas presente no banco de dados sejam exibidas na combobox

  3. A string de conexão é montada automaticamente  no formato : Select * from Nome_da_Tabela

  4. 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:

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.Click

 

Dim 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 - 1

      cbotabelas.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:

If Not cbotabelas Is Nothing Then

   For i = 0 To nome_Tabelas.Length - 1

      cbotabelas.Items.Add(nome_Tabelas(i))

   Next

End If

If cbotabelas.Items.Count > 0 Then

   cbotabelas.SelectedIndex = 0

End If

Esta 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 = "" Then

   sql = "Select * from Tabela"

End If

'se o parametro passado para a funcao estiver vazio atribui o padrao

If sqlstring = "" Then

   sqlstring = sql

End If

 

sql = sqlstring

'se a string de conexao estiver vazia atribui o valor padrão

If strcon = "" Then

   strcon = "server=(local);Trusted_Connection=yes;database=" & NomeBancoDados

End If

'cria uma nova conexao , se houver erro exibe o erro e seu numero

Try

    con = New SqlConnection(strcon)

Catch ex As Exception

    MessageBox.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 esquema

dap.MissingSchemaAction = MissingSchemaAction.AddWithKey

'preenche o dataset e se houver erro exibe a mensagem e o numero do erro

Try

   dap.Fill(dst, NomeTabela)

Catch ex As Exception

   MessageBox.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 j

  coluna = 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 combobox

cboCampos.Items.Clear()

'preenche o combo box com o nome das colunas

For i = 0 To ListView1.Columns.Count - 1

cboCampos.Items.Add(ListView1.Columns(i).Text)

Next

'define o primeiro valor da combo como selecionado

If cboCampos.Items.Count > 0 Then

cboCampos.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 - 1

          ListView1.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 Then

    con.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

Try

  If con.State = ConnectionState.Open Then

    con.Close()

  End If

Catch 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