VB.NET - Exibindo nome de tabelas e campos de um Banco de dados


Abaixo temos duas figuras que exibem o formulário de nossa aplicação em tempo de desenho (fig 1.0) e em tempo de execução (fig 2.0)

fig 1.0 - formulário da aplicação fig 2.0 - resultado da execução da aplicação

O objetivo é : dado um caminho e nome de um banco de dados Access , exibir suas tabelas e os respectivos campos de uma determinada tabela selecionada.

Nota : No artigo : ADO.NET - Obtendo o esquema de uma fonte de dados  - eu falei sobre como obter esquemas de tabelas usando ADO.NET.

Agora ao trabalho.

Crie um novo projeto no Visual Studio.NET com as seguintes características (sinta-se a vontade para alterar a seu gosto.)

  1. Project Types : Visual Basic .NET
  2. Templates : Windows Application
  3. Name : NomeTabelsBD
  4. Location : c:\vbnet\NomeTabelsBD

No formulário padrão insira os seguintes controles : Label , TextBox , GroupBox , Button  e ListBox conforme o layout acima . Os nomes do controles que tiveram esta propriedade alterada foram:

TextBox name = txtMDB
Button name = btnProcura
ListBox lstTabelas e lstColunas

No inicio do formulário vamos declarar duas variáveis que deverão ser visíveis em todo o formulário :

Dim nomeMDB As String
Dim
acesso As AcessoBD

- nomeMDB é uma string que irá guardar o nome e caminho do banco de dados
- acesso é uma variável do tipo AceessoBD - que irá guardar uma instância da classe AcessoBD que iremos criar

- O usuário deverá fornecer o caminho e nome do banco de dados Access e clicar no botão Procurar. O código do evento Click deste botão é o seguinte :

    Private Sub btnProcura_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcura.Click
        If txtMDB.Text = "" Then

            Dim openFileDialog1 As New OpenFileDialog()

            openFileDialog1.InitialDirectory = "c:\teste"
            openFileDialog1.Filter = "mdb files (*.mdb)|*.mdb|All files (*.*)|*.*"
            openFileDialog1.FilterIndex = 2
            openFileDialog1.RestoreDirectory = True

            If openFileDialog1.ShowDialog() = DialogResult.OK Then
                nomeMDB = openFileDialog1.FileName
              End If
        Else
            nomeMDB = txtMDB.Text
        End If
 
        If IO.File.Exists(nomeMDB) Then
                GroupBox1.Text = nomeMDB
                acesso.conectarDB(nomeMDB)
                lstTabelas.DataSource = acesso.nomeTabelas
        End If

    
    End Sub

 

Neste código estou usando as caixas de diálogo padrão do Windows , no caso a caixa - AbrirArquivo (OpenFile). Vou exibir a janela Abrir Arquivo como modal. Se você lembra no VB 6.0 para abrir um janela como modal usamos o método Show com o parâmetro vbModal.

No VB.NET usamos o método ShowDialog para exibir um formulário como modal. Para exibir um formulário como não modal usamos o método Show.

Nota: Um objeto Modal precisa ser fechado ou escondido ante de continuar trabalhando com o resto da aplicação.

Ainda recordando , no VB 6.0 tínhamos o controle CommonDialog que fornecia diversas caixas de diálogos. No VB.NET este controle foi substituido pelos controles : ColorDialog  , FonteDialog , OpenFileDialog , PageSetupDialog , PrintDialog , e PrintPreviewDialog e SaveFileDialog.  Nosso projeto irá usar o controle OpenFileDialog.

A caixa de diálogo será aberta se não houver nome de arquivo informado na caixa de texto txtMDB. Após selecionar o nome do arquivo ele será atribuído a variável : nomeMDB através da propriedade FileName nomeMDB = openFileDialog1.FileName

Após receber o nome do arquivo verificamos se o mesmo existe e em caso positivo acessamos os métodos : conectarDB() e nomeTabelas da classe AcessoBD conforme mostrado no trecho de código abaixo:

        If IO.File.Exists(nomeMDB) Then
                GroupBox1.Text = nomeMDB
                acesso.conectarDB(nomeMDB)
                lstTabelas.DataSource = acesso.nomeTabelas
        End If

Ao ser executado o ListBox - lstTabelas será preenchido com o nome das tabelas. Ao clicar em um item do listbox iremos usar o método nomesColunas da classe AcessoBD conforme abaixo :

Private Sub btnColunas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnColunas.Click


If lstTabelas.SelectedIndex <> -1 Then

     lstColunas.DataSource = acesso.nomesColunas(lstTabelas.SelectedItem)

End If


End
Sub

A instância da classe pode ser obtida no evento Load do formulário :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    acesso =
New AcessoBD()
End Sub

Para criar a classe AcessoBD , no menu Project selecione a opção : Add Class ; selecione Class e informe nome do arquivo como AcessoBD.vb. A estrutura desta classe é exibida abaixo:

Imports System.Data.OleDb

Public Class AcessoBD

Friend dbConnection As OleDbConnection

Friend dbDataAdapter As OleDbDataAdapter

Friend CadeiaConexao As String

Friend ArquivoDados As String

Friend Sub conectarDB(Optional ByVal NomeBaseDados As String = "")
End
Sub

Friend Sub nomeTabelas(Optional ByVal commandString As String = "")
End
Sub

Friend Function nomesColunas(ByVal nome_Tabela As String) As String()
End
Function

End Class

Como você pode ver a classe possui os atributos :

Friend dbConnection As OleDbConnection

Friend dbDataAdapter As OleDbDataAdapter

Friend CadeiaConexao As String

Friend ArquivoDados As String

e os métodos :

Friend Sub conectarDB(Optional ByVal NomeBaseDados As String = "")
End
Sub

Friend Sub nomeTabelas(Optional ByVal commandString As String = "")
End
Sub

Friend Function nomesColunas(ByVal nome_Tabela As String) As String()
End
Function

Em todos eles estamos usando o modificador Friend , isto faz com que os atributos e métodos sejam acessíveis somente dentro do programa que contém a declaração.

Nota: Temos cinco tipos de acesso : Public , Protected , Friend , Protected Friend e Private. O tipo Public é o que possui acesso mais abrangente e o tipo de acesso private o menos abrangente.

O código de cada método da classe AcessoBD é dado a seguir :

1- Método conectarBD - recebe o nome da base de dados como parâmetro.

Friend Sub conectarDB(Optional ByVal NomeBaseDados As String = "")


ArquivoDados = NomeBaseDados


If
ArquivoDados = "" Then

    Exit Sub

End If

'

CadeiaConexao = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & ArquivoDados
 

Try

    dbConnection = New OleDbConnection(CadeiaConexao)

Catch e As Exception

    MessageBox.Show("Erro ao cria a conexão :" & vbCrLf & e.Message)

    Exit Sub

End Try


dbConnection.Open()


End
Sub

2- Método nomeTabelas - retorna um array com o nome das tabelas do banco de dados.

Friend Function nomeTabelas() As String()
 

Dim nomeTabelas_() As String

Dim dataTable As Data.DataTable

Dim dbNull As System.DBNull

Dim restricoes() As Object = {dbNull, dbNull, dbNull, "TABLE"}

Dim i As Integer


If
dbConnection Is Nothing Then

   dbConnection = New Data.OleDb.OleDbConnection(CadeiaConexao)

End If
 

If dbConnection.State <> ConnectionState.Open Then

    dbConnection.Open()

End If
 

dataTable = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, restricoes)


i = dataTable.Rows.Count - 1


If
i > -1 Then

   ReDim nomeTabelas_(i)

   For i = 0 To dataTable.Rows.Count - 1

        nomeTabelas_(i) = dataTable.Rows(i).Item("TABLE_NAME").ToString()  

    Next

End If
 

Return nomeTabelas_


End
Function

3- O método nomesColunas() , recebe o nome da tabela e retorna um array com o nome das colunas.

Friend Function nomesColunas(ByVal nome_Tabela As String) As String()
 

Dim columna As Data.DataColumn

Dim i, j As Integer

Dim nomCol() As String

Dim comandoSQL = "Select * from " & nome_Tabela


dbDataAdapter =
New OleDbDataAdapter(comandoSQL, dbConnection)


Dim dbDataset As New DataSet(nome_Tabela)

Try

     dbDataAdapter.Fill(dbDataSet, nome_Tabela)

Catch ex As Exception

     MessageBox.Show("Erro ao preencher DataSet :" & vbCrLf & ex.Message)

     Exit Function

End Try

 

j = dbDataSet.Tables(nome_Tabela).Columns.Count - 1

ReDim nomCol(j)

For i = 0 To j

   columna = dbDataSet.Tables(nome_Tabela).Columns(i)

    nomCol(i) = columna.ColumnName

Next

 

Return nomCol

End Function

Neste artigo você criou uma classe com métodos para acessar e retornar o nome das tabelas e suas respectivas colunas de um banco de dados Access.

Até o próximo artigo VB.NET ...


José Carlos Macoratti