VB .NET - Criando e compactando bases de dados Access


Esta usando VB .NET ?  Quer criar e compactar um banco de dados Access ?  Vai usar o que ? ADO ? ADO .NET ?

Bem , eu tenho duas notícias para você. Uma boa e outra ruim. Vou começar pela ruim para tudo ter um final feliz...

A notícia ruim é que nem ADO nem ADO .NET fornecem meios para criar e/ou compactar uma base de dados Access.

A notícia boa é que :

E onde entra o VB .NET nesta história ?  O que o VB .NET tem a ver com o ADOX e JRO ?

Se você ainda não sabia vai ficar sabendo que podemos usar todos os objetos COM no VB .NET através da camada Interop.  Calma !!! Vou explicar ...

A teoria

Uma das grandes promessas do COM é a independência de linguagem. Se você criasse um componente em C++, você o poderia usar em VB e vice-versa. Contudo, para chegar a este ponto, o seu código tinha que ser compilado para um padrão COM. Muito disto era transparente para o desenvolvedor VB, mas seu componente tinha que implementar as interfaces IUnknown e IDispatch.

Sem estas interfaces, ele não seria um verdadeiro componente COM. Contudo o COM apenas lhe dá interoperabilidade entre linguagens no nível binário. Isto significa que você somente pode tirar vantagem desta interoperabilidade em tempo de execução.

O modelo COM - Component Object Model - permite que um objeto exponha suas funcionalidades para outros componentes e aplicações. O modelo de objetos da .NET Framework é diferente do modelo COM :

Já deu para sentir que a CLR - common language runtime - usada pela plataforma .NET oferece muitas vantagens sobre o modelo COM.

Eventualmente você pode usar um componente COM em uma aplicação da plataforma .NET. A interoperabilidade com o modelo COM ou Interop , permite que você use objetos COM em suas aplicações .NET.

Quando você for usar objetos COM e um projeto .NET você precisa estar atento as diferenças existentes no gerenciamento de memória. Um objeto .NET é alocado na memória gerenciada - a memória que a CLR controla. Já um objeto COM é alocado na memória não gerenciada. O VS .NET e a plataforma .NET fornecem ferramentas para controlar a interação destes componentes gerenciados e não gerenciados.

O código gerenciado tem este nome porque é o run-time .NET controla a alocação de memória e a checagem de tipos. Para acessar o código não gerenciado dos objetos COM usamos as interop assemblies. Você sabe o que é um assembly ???

Um assembly é um bloco de construção primário da aplicação .NET. Ela é uma coleção de funcionalidades que é construída , versionada e empregada  como uma unidade de implementação contendo um ou mais arquivos. (São arquivos (DLL´s) físicos onde estão os namespaces).

As Interop Assemblies são assemblies .NET que atuam como uma ponte entre o código gerenciado e o código não gerenciado, mapeando os membros dos objetos COM equivalentes aos membros .NET.

No VB .NET você pode referenciar um objeto COM como fazia na versão anterior do VB . A única diferença é que o VB .NET cria uma interop assembly associado. As referências para os membros do objeto COM são roteados para este assembly e então direcionados para o objeto COM atual e vice-versa.

Para fazer este tratamento a CLR fornece classes de invólucro , Wrapper classes , que tratam clientes gerenciados e não gerenciados como se estivessem no mesmo ambiente. Quando um aplicativo .NET chama um método de um objeto COM , é criado o invólucro - RCW - Runtime Callable Wrapper . Quando um objeto COM chama um método .NET , é criado o invólucro - CCW - COM Callable Wrapper . Estes invólucros criam a camada de interoperabilidade entre objetos COM e .NET.

A CLR lhe dá muito mais interoperabilidade entre linguagens. Você pode não apenas derivar classes de um PE (Portable Executable) escrito na linguagem A e usá-las na linguagem B, mas a depuração funciona entre componentes de múltiplas linguagens. Desta forma, você pode percorrer o código em um PE escrito em C# e saltar para uma classe base escrita em VB.NET.

Nota: um PE (executável Portável) contém o MSIL(codigo gerenciado em linguagem intermediária) e os metadados. E é o resutado da compilação de um projeto VB .NET.

Isto significa que sua interoperabilidade entre linguagens está ocorrendo em tempo de design e de runtime; não só no runtime que lhe é dado pelo COM. Agora você pode gerar um erro (agora chamado de uma exceção) em uma linguagem e tê-lo tratado em um componente escrito em outra. Os desenvolvedores podem usar as linguagens com as quais eles se sentem mais confortáveis, e estarem certos de que outros codificando em diferentes linguagens serão capazes de usar seus componentes com facilidade.

Para incluir uma referência a um objeto COM faça o seguinte:

  1. No menu Project menu, selecione a opção Add Reference e clica na guia COM.
  2. Selecione o componente que você deseja usar da lista de objetos COM.

Nota:

Quando um programa faz uma chamada a um componente COM , o Service Control Manager vai ao registry, pesquisa a informação do componente, localiza o objeto, cria-o e retorna para a  aplicação que o chamou um ponteiro para o objeto recém criado.

O .NET não usa o registry, portanto, ele tem que usar um mecanismo diferente para localizar os assemblies que são referenciados em uma aplicação ( ou em outro assembly ).

A prática

Vamos então mostrar como usar os componentes COM para criar e compactar uma base de dados Access. Vou usar um projeto do tipo console por questão de simplicidade mas o código será basicamente o mesmo  para qualquer outro tipo de projeto.

1- Criando uma base de dados Access

- Crie um novo projeto do tipo Console no VB .NET com um nome sugestivo. Que tal : CriaBaseAccess

- Na janela Solution Explorer , clique com o botão direito do mouse em References e a seguir clique em Add Reference

- Na janela de diálogo - Add Reference - clique na guia COM ; a seguir clique em - Microsoft ADO Ext. 2.7 for DDL and Security; clique em Select para incluir o componente na seção - Selected Components e a seguir clique em OK.

Agora você deverá incluir o código abaixo no módulo . Ele irá criar uma base de dados Access 2000 (Jet 4.0).

Imports ADOX


Module
Module1

Sub Main()
 

Dim catalogo As Catalog = New Catalog()


Try

      catalogo.Create("Provider=Microsot.Jet.OLEDB.4.0;" & _

                            "Data Source=C:\Macoratti.mdb;" & _

                            "Jet OLEDB:Engine Type=5")
 

      Console.WriteLine("Banco de dados - Macoratti.mdb - criado com sucesso .")

Catch e As Exception

     Console.WriteLine("Erro ao tentar criar o Banco de dados - Macoratti.mdb.")

     Console.WriteLine(e.Message)

Finally

    catalogo = Nothing

End Try
 

End Sub

End Module

1- Compactando uma base de dados Access

 Crie um novo projeto do tipo Console no VB .NET com um nome sugestivo. Que tal : CompactaBaseAccess

- Na janela Solution Explorer , clique com o botão direito do mouse em References e a seguir clique em Add Reference

- Na janela de diálogo - Add Reference - clique na guia COM ; a seguir clique em - Microsoft Jet and Replication objects 2.x Library ; clique em Select para incluir o componente na seção - Selected Components e a seguir clique em OK.

Agora você deverá incluir o código abaixo no módulo . Ele irá compactar uma base de dados Access 2000 (Jet 4.0).

Module Module1

 

Sub Main()


Dim
jro As JRO.JetEngine

jro = New JRO.JetEngine()

Try

      jro.CompactDatabase("Provider=Microsot.Jet.OLEDB.4.0;Data Source=C:\Macoratti.mdb",   _

                                    "Provider=Microsot.Jet.OLEDB.4.0;Data     Source=C:\Novo_Macoratti.mdb;Jet OLEDB:Engine Type=5")

     Console.WriteLine(" Banco de dados foi compactado com sucesso.")

Catch e As Exception

     Console.WriteLine(" Erro ao compactar o Banco de dados.")

     Console.WriteLine(e.Message)

End Try
 

End Sub

End Module

Nota: para compactar uma base de dados você precisa de acesso exclusivo ao arquivo.

Moleza , não é mesmo !!! Até o próximo artigo ...


José Carlos Macoratti