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:
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
Sub
Main() Dim catalogo As Catalog = New Catalog()
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 ExceptionConsole.WriteLine("Erro ao tentar criar o Banco de dados - Macoratti.mdb.") Console.WriteLine(e.Message) Finallycatalogo = Nothing End TryEnd 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()
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 ExceptionConsole.WriteLine(" Erro ao compactar o Banco de dados.") Console.WriteLine(e.Message) End TryEnd 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