none
Criar Banco Dados Access com VB.NET RRS feed

  • Pergunta

  • Boa tarde!

    Preciso criar um Banco de Dados Access em tempo de execução. Fiz algumas pesquisas e encontrei o artigo do Macoratti.

    http://www.macoratti.net/vbn_adox.htm

    O problema é quando vai executar o comando Catalogo.Create da o erro "Classe não registrada".

    Dim Catalogo As New ADOX.Catalog
    
    Try
       Catalogo.Create("Provider=Microsot.Jet.OLEDB.4.0; Data Source=" & BancoDados_Pasta & BancoDados_Nome & ".mdb;")
    Catch ex As Exception
    End Try

    O que tenho que fazer?

    Obrigado!

    quarta-feira, 29 de outubro de 2014 18:42

Respostas

  • Assim funciona:

    Imports ADOX

    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            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")

                MessageBox.Show("Banco de dados - Macoratti.mdb - criado com sucesso .")

            Catch
                MessageBox.Show("Erro ao tentar criar o Banco de dados - Macoratti.mdb.")

            Finally
                catalogo = Nothing
            End Try
        End Sub

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            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")
                MessageBox.Show(" Banco de dados foi compactado com sucesso.")
            Catch
                MessageBox.Show(" Erro ao compactar o Banco de dados.")
            End Try
        End Sub
    End Class



    • Sugerido como Resposta Mr. GMSOFT quinta-feira, 30 de outubro de 2014 19:03
    • Editado Mr. GMSOFT quinta-feira, 30 de outubro de 2014 19:05
    • Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 31 de outubro de 2014 16:46
    quinta-feira, 30 de outubro de 2014 19:03

Todas as Respostas

  • Você fez estas 2 referências?

    1. Microsoft ActiveX Data Objects 2.0 Library (Interop.ADODB.dll)
    2. Microsoft ADO Ext. 2.8 for DDL and Security (Interop.ADOX.dll)

    Configurou o seu projeto para compilar com Any CPU?

    quinta-feira, 30 de outubro de 2014 02:53
  • Fiz somente a 2ª referencia como explica o artigo do Macoratti. A aplicacao estava compilando Any CPU, mas como estou usando plataforma 64, configurei para compilar em X86, mas mesmo assim nao deu certo.

    Fiz a referencia que voce solicitou, mas nada feito, continua com o mesmo erro.

    Obrigado!


    quinta-feira, 30 de outubro de 2014 13:13
  • Os passos que sugeri funcionam. Já experimentou seguí-los? 
    quinta-feira, 30 de outubro de 2014 13:45
  • Segui os passos e nada, mesmo erro. Obrigado!
    quinta-feira, 30 de outubro de 2014 13:56
  • http://stackoverflow.com/questions/16082071/generating-a-new-ms-access-file-in-vb-net

    Experimente, deve funcionar.

    quinta-feira, 30 de outubro de 2014 16:28
  • Acabei de seguir passo a passo no link do Macoratti e funcionou sem problemas, as referências são essas para serem adicionadas:

    Microsoft Jet and Replication objects 2.x Library
    Microsoft ADO Ext. 2.7 for DDL and Security

    • Editado Mr. GMSOFT quinta-feira, 30 de outubro de 2014 16:49
    quinta-feira, 30 de outubro de 2014 16:49
  • Mesmo erro, mas que coisa, e ja testei em dois computadores, um com w764 e outro com w732.
    quinta-feira, 30 de outubro de 2014 17:09

  • Cara acho que você deve ter esquecido algum detalhe, minha maquina é x64 e tenho outra x86 e todas as duas funcionaram sem problemas, sugiro que reveja e compare o que você fez com o do Tutorial do Macoratti, segue trecho do meu código:

    CompactaBaseAccess:

    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

    CriaBaseAccess

    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
    quinta-feira, 30 de outubro de 2014 17:35
  • Nao sei o que esta ocorrendo, mas fiz tudo certo, inclusive copiei o codigo do site do Macoratti e colei, mas nao funciona.

    quinta-feira, 30 de outubro de 2014 18:00
  • Assim funciona:

    Imports ADOX

    Public Class Form1

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            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")

                MessageBox.Show("Banco de dados - Macoratti.mdb - criado com sucesso .")

            Catch
                MessageBox.Show("Erro ao tentar criar o Banco de dados - Macoratti.mdb.")

            Finally
                catalogo = Nothing
            End Try
        End Sub

        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            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")
                MessageBox.Show(" Banco de dados foi compactado com sucesso.")
            Catch
                MessageBox.Show(" Erro ao compactar o Banco de dados.")
            End Try
        End Sub
    End Class



    • Sugerido como Resposta Mr. GMSOFT quinta-feira, 30 de outubro de 2014 19:03
    • Editado Mr. GMSOFT quinta-feira, 30 de outubro de 2014 19:05
    • Marcado como Resposta Ricardo Barbosa Cortes sexta-feira, 31 de outubro de 2014 16:46
    quinta-feira, 30 de outubro de 2014 19:03
  • Mas esta idêntico, vc não mudou absolutamente nada. Tive o cuidado de checar letra a letra. E tem outra questão que temos que analisar. O erro é "Classe nao Registrada", portanto não esta acusando erro na sintaxe.

    Mas de qualquer forma, agradeço!

    quinta-feira, 30 de outubro de 2014 19:27
  • rsrs não esta idêntico não, o erro que acusa é a declaração Catch ex As Exception veja se tem isso no meu código ou melhor copia meu código e coloca na sua aplicação
    quinta-feira, 30 de outubro de 2014 19:40
  • Eu me referi ao comando propriamente:

    catalogo.Create("Provider=Microsot.Jet.OLEDB.4.0;Data Source=C:\Macoratti.mdb;Jet OLEDB:Engine Type=5")
    é nessa linha que ocorre o erro e vai pro Catch, agora se no Catch eu crio uma variável para receber a exception ou não, isso não vai corrigir o erro. Mas pra desencargo de consciência eu testei, o erro ocorre mas não tenho uma variável para receber o erro.

    Obrigado!

    quinta-feira, 30 de outubro de 2014 19:45
  • Bom dia Davi,

    Estou enfrentando o mesmo problema ao tentar compactar um banco Access, usando VS 2010 com VB.NET.

    System.Runtime.InteropServices.COMException (0x80040154): Class not registered    at JRO.IJetEngine.CompactDatabase

    Nas máquinas que tem Visual Studio funciona, mas naquelas sem VS ocorre este erro. tanto em Win32 quanto 64 bits.

    Você conseguiu resolver este problema?

    Obrigado!

    segunda-feira, 26 de janeiro de 2015 13:36
  • Instala o office Tools runtime 2010

    O código postado por mim funciona, eu mesmo testei e rodou sem problemas ,mais o dono da Thread não mais retornou, faz o teste e veja se funciona para você

    segunda-feira, 26 de janeiro de 2015 13:45
  • Não funcionou novamente. Minha aplicação é Windows Forms e TARGET CPU é X86.

    Instalei o Office Tools Runtime, MDAC 2010 e MDAC 2007. Uso VS 2010 com .NET Framework 4.0. Adicionei referência COM para o JRO e ADO 2.8.

    O código é:

     Dim JRO As JRO.JetEngine
            JRO = New JRO.JetEngine
            Try
                Dim source = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + arq + ";Jet OLEDB:Database Password=123;"
                Dim compact = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + arqC + ";Jet OLEDB:Database Password=123;Jet OLEDB:Engine Type=5"
                JRO.CompactDatabase(source, compact)
            Catch
                MessageBox.Show(" Erro ao compactar o Banco de dados.")
            End Try


    O erro que retorna está listado abaixo. 

    ************** Exception Text **************
    System.Runtime.InteropServices.COMException (0x80040154): Class not registered
       at JRO.IJetEngine.CompactDatabase(String SourceConnection, String Destconnection)
       at Compactador.frmPrincipal.btCompactar_Click_1(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** Loaded Assemblies **************
    mscorlib
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    Compactador
        Assembly Version: 1.0.0.0
        Win32 Version: 1.0.0.0
        CodeBase: file:///C:/Users/WIN7/AppData/Local/Apps/2.0/5D5YO74E.RNG/VG4MZ6LA.P09/comp..tion_076b1fdd1315bb3a_0001.0000_129f1944a926565b/Compactador.exe
    ----------------------------------------
    Microsoft.VisualBasic
        Assembly Version: 10.0.0.0
        Win32 Version: 10.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
    ----------------------------------------
    System
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Core
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
    ----------------------------------------
    System.Windows.Forms
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System.Runtime.Remoting
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
    ----------------------------------------
    System.Configuration
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 (RTMRel.030319-0100)
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Xml
        Assembly Version: 4.0.0.0
        Win32 Version: 4.0.30319.1 built by: RTMRel
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------

    segunda-feira, 26 de janeiro de 2015 15:45
  • Veja essa Thread você deve estar esquecendo de colocar alguma coisa ou a referencia esta errada
    segunda-feira, 26 de janeiro de 2015 16:38
  • Instalei o ADO 2.8 no Windows e meu programa agora compactou arquivos MDB. Porém para ACCDB agora dá erro de formato. O que será que falta instalar?

    Lembrando que em máquinas que possuem VS roda perfeitamente para mdb e accdb.

    segunda-feira, 26 de janeiro de 2015 17:25
  • Esses arquivos utilizam outro tipo de provider ao invés de JET usa o ACE, veja aqui nessa Thread
    • Editado Mr. GMSOFT segunda-feira, 26 de janeiro de 2015 17:30
    segunda-feira, 26 de janeiro de 2015 17:29
  • Veja que na minha string de conexão eu uso ACE.OLEDB.12
    segunda-feira, 26 de janeiro de 2015 17:43
  • Só vi agora, ,mais provavelmente esta faltando nas maquina isso aqui veja se vai instalar a versão 64bits ou 32bits, caso não funcione posta a tela do erro
    • Editado Mr. GMSOFT segunda-feira, 26 de janeiro de 2015 17:52
    segunda-feira, 26 de janeiro de 2015 17:52
  • Tentei por 2 caminhos:<o:p></o:p>

    - Dim JRO As Object :  
       JRO = CreateObject("JRO.JetEngine")

    - Dim dbEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine
      dbEngine.CompactDatabase(arq, arqC)

    Nos usuários instalei o MDAC 2010 e o MDAC 2007. Consegue compactar arquivos MDB, mas dá erro para ACCDB. Nas máquinas com VS 2010 compacta os 2 formatos.<o:p></o:p>

    O erro que retorna é:<o:p></o:p>

    ************** Exception Text **************
    System.Runtime.InteropServices.COMException (0x80004005): Cannot open database ''.  It may not be a database that your application recognizes, or the file may be corrupt.
       at Microsoft.VisualBasic.CompilerServices.LateBinding.InternalLateCall(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack, Boolean IgnoreReturn)
       at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack, Boolean IgnoreReturn)
       at Compactador.frmPrincipal.btCompactar_Click_1(Object sender, EventArgs e)
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam
    , IntPtr lparam)<o:p></o:p>


    terça-feira, 27 de janeiro de 2015 14:35
  • Veja aqui essa Thread, receberam o mesmo erro e tem a reposta para a correção aparentemente simples
    terça-feira, 27 de janeiro de 2015 14:50
  • O caminho do banco já é absoluto:  

    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & arq & ";Jet OLEDB:Database Password=123;"

    Não consigo identificar o que falta instalar em máquinas que não possuem VS.

    Obrigado

    terça-feira, 27 de janeiro de 2015 15:24
  • Consegui fazer funcionar, mas foi necessário no PC com Windows 7 64 bits e Office 2013 64 bits, instalar o MDAC 2010 versão 32 bits. Para isto basta rodar via linha de comando com o parâmetro /passive.

    Só que isto gera outros problemas, pois as aplicações 64 bits que precisam do MDAC 64 deixam de funcionar.


    terça-feira, 27 de janeiro de 2015 16:16
  • Ai nesse caso vai ter que obter a versão do sistema operacional e instalar conforme x64 ou x86
    • Sugerido como Resposta Claudio Siviero terça-feira, 30 de agosto de 2016 01:23
    • Não Sugerido como Resposta Claudio Siviero terça-feira, 30 de agosto de 2016 01:23
    • Sugerido como Resposta Claudio Siviero terça-feira, 30 de agosto de 2016 01:23
    • Não Sugerido como Resposta Claudio Siviero terça-feira, 30 de agosto de 2016 01:23
    terça-feira, 27 de janeiro de 2015 16:33
  • Solucionei o problema de classe não registrada ao criar o banco de dados no windows 64 bits da seguinte maneira:
    Alterei a Opção nas propriedades do projeto

    Em: "ADVANCE COMPILE OPTION" e coloquei em "TARGET CPU" = x86

    Outro problema relacionado que tive foi que ao criar o Banco de dados ele ficava bloqueado para renomear, 
    deletar etc liberando somente quando fechava o aplicativo que o criou, 
    como solução fiz um modulo console externo com o DSN como parametro para criar o banco de dados 
    sendo chamado pelo aplicativo principal, podendo assim ser excluido se necessário antes de fechar o aplicativo que o criou.
    terça-feira, 30 de agosto de 2016 01:41