C# - Obtendo a relação de tabelas de um banco de dados Access


Nesta dica eu mostro como obter a relação de tabelas de um banco de dados Access usando a linguagem C#.

Eu estou usando o SharpDevelop 3.2 e o banco de dados Northwind.mdb.

Nota: Você também pode usar o Visual C# 2008 Express Edition

Abra o SharpDevelop 3.2 e no menu Arquivo selecione Novo-> Solução;

Na janela Tipos de Projetos Selecione C# -> Aplicações Windows e na janela Modelos selecione Aplicação Windows;

A seguir informe o nome do projeto: tabelasAcess;

No formulário padrão criado no projeto inclua os seguintes controles a partir da ToolBox:

Declare os seguintes namespaces no início do formulário:

using System.Data;
using System.Data.OleDb;

Declare uma variável do tipo DataTable, visível no formulário, após a declaração do formulário:

DataTable dt = null;

No evento Click do botão - Obter Tabelas defina o código a seguir:

void BtnTabelasClick(object sender, EventArgs e)
{
	//verifica se foi informado o caminho e nome do banco de dados
     if (txtCaminho.Text != string.Empty)
     {
       string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txtCaminho.Text + ";";
       OleDbConnection connection = new OleDbConnection(ConnectionString);
       try
       { 
       connection.Open();
      
       //Obtem um datatable do esquema do banco de dados
       //e exibe no datagridview
       dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        gdvTabelas.DataSource = dt.DefaultView;
       }
       catch (Exception ex)
       {
           MessageBox.Show("Erro ao acessar o banco de dados " + ex.Message);
       }
    }
   else
   {
            MessageBox.Show("Informe o caminho e nome do banco de dados. Ex: c:\\temp\\banco.mdb");
    }
}

Este código obtém um datatable contendo todo o esquema do banco de dados. Isso é feito pela linha de comando:

dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

O Método OleDbConnection.GetOleDbSchemaTable retorna informações de esquema de um Origem de Dados conforme indicado por um GUID, e depois ele se aplica as restrições especificadas. A sua sintaxe é a seguinte:

Public Function GetOleDbSchemaTable ( schema As Guid, restrictions As Object() ) As DataTable

A tabela de esquema é retornada como um DataTable que possui o mesmo formato que um conjunto de linhas de esquema OLE DB especificado pelo parâmetro schema. Você pode usar este parâmetro para filtrar as linhas retornadas no DataTable gerado.

No exemplo eu estou usando o botão Exibir Tabelas Usuário para filtrar as tabelas exibindo somente as tabelas criados do usuário. O código que faz isso é dado a seguir:

void BtnFiltrarClick(object sender, EventArgs e)
{
           //verifica se existem tabelas selecionadas e filtra
           if (dt != null) 
           {
	int i=0;
	foreach (DataRow row in dt.Rows)
           {
              //filtra as tabelas selecionadas 	
              string strNomeTabela = row["TABLE_NAME"].ToString();

               if (row["TABLE_TYPE"].ToString()=="TABLE")
               {
               	 //inclui as tabelas na combobox
               	    cboTabelas.Items.Add(strNomeTabela);
                    i++;
               }
               //seleciona o primeiro item da combobox
               cboTabelas.SelectedIndex =0;
		}
   	}
  	else
  	{
	      MessageBox.Show("Não existem tabelas selecionadas para o BD");
                }
}

Ao executar o projeto e clicar no botão Obter Tabelas temos a exibição do esquema no DataGridView exibindo todas as tabelas pois não impusemos nenhuma restrição;

Ao clicar no botão Exibir Tabelas do Usuário estamos filtrando para obter somente as tabelas criadas pelo usuário:

Pegue o projeto completo aqui: tabelasAccess.zip

Eu sei é apenas C# mas eu gosto...

Referências:


José Carlos Macoratti