Java + Access incompatibilidade de arquiteturas

Boa tarde, pessoal. Esse é o meu primeiro post no forum, e eu gostaria de esclarecer que já passei quase 1 semana buscando uma solução pra esse problema banal, e não consegui encontrar nada… Apenas 1 pessoa em um outro forum teve esse mesmo problema e não tinha a solução naquele post, então resolvi postar aqui o que está acontecendo.

Estou criando uma aplicação simples em JAVA que se conecta com o banco de dados Access, mas não está funcionando direito. Já tentei fazer de várias formas… Primeiro tentei fazer com o ODBC 32 bits que você abre por linha de comandos, e funcionava no Netbeans, porém construído dava problema no driver… Daí tentei instalar o driver 64 bits do Access pra ver se funcionava. Continuou funcionando no netbeans e construído dava um problema de incompatibilidade de arquiteturas entre o driver e a aplicação… E com a conexão “DSN-less” como eles chamam nem o driver é encontrado…

Aqui está o meu código da conexão. Muito Obrigado pela atenção.

[code]package utilitarios;
import java.sql.;
import javax.swing.
;

public class Conexao
{
final private String driverName = “sun.jdbc.odbc.JdbcOdbcDriver”;
//final private String url = “jdbc:odbc:DietManager”;
final private String url = “jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=db/DietManager.accdb”;
final private String username = “”;
final private String password = “”;
private Connection connection;
public Statement stmt;
public ResultSet rs;
boolean result = true;

public boolean Conecta(){
    result = true;
    try   
    {  
        // Carregando o JDBC Driver  
        Class.forName(driverName);  

        // Criando a conexão com o Banco de Dados  
        connection = DriverManager.getConnection(url, username, password);  
        JOptionPane.showMessageDialog(null,"Conectou");
        stmt = connection.createStatement();
    }

    catch (ClassNotFoundException sqlex) {  
            //Driver não encontrado  
            JOptionPane.showMessageDialog(null,"O driver especificado não foi encontrado." + sqlex);
            result = false;
    }

    catch (SQLException sqlex){  
            //Não está conseguindo se conectar ao banco   
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao Banco de Dados" + sqlex);
            result = false;
    }
    return result;
}[/code]

Não existe incompatibilidade, inclusive você pode conectar usando JDBC, o que seria mais apropriado. Procure na busca do forum sobre ‘access odbc’ ou ‘access jdbc’ que vai achar muita coisa.

Olá, bem-vindo ao fórum.

Por favor, não banalize tags informaticas escrevendo informações como [Dúvida], [Ajuda] ou [Urgente].
Use-as para falar o que não é óbvio como [Resolvido].

Desculpe pela tag. Maus hábitos de Orkut hehehe.

Acho que você não entendeu, amigo. Eu queria fazer um aplicativo que permitisse cadastrar dados e salvar em tabelas de um banco de dados, sem que precisasse de um banco de dados remoto, como MySQL, ou que precisasse configurar o DSN para utilizar (como o Access com DSN), o caso é que funciona perfeitamente no Netbeans o meu programa, porém ele CONSTRUÍDO dá esse problema…

java.sql.SQLException: [Microsoft][ODBC Driver Manager] O DSN especificado contém uma incompatibilidade de arquiteturas entre o Driver e o Aplicativo

Nesse caso, você terá muito menos estresse com o HSQLDB.
Além do fato dele não ser pago, como o access é.

Muito obrigado pela dica, ViniGodoy. Esse HSQLDB é EXATAMENTE o que eu procurava… Eu não conhecia a expressão “standalone” então não sabia como procurar. Pensei que qualquer banco de dados dava suporte a esse tipo de aplicação. Mas meu problema agora é outro…

Segui um tutorial de como usar este banco de dados, como fazer a conexão e tudo mais. Adicionei o .jar ao CLASSPATH, fiz a conexão com o banco (que foi bem sucedida), criei o banco de dados e a tabela pela interface gráfica do HSQL Database Manager e tentei inserir e pesquisar dados e tudo funciona perfeitamente. Eu consegui encontrar onde estão os 4 aquivos do banco de dados que são criados, eles estão dentro do diretório C:\Java\hsqldb\demo\ … Eu queria saber como eu coloco isso num package do meu projeto, para que ele possa estar na minha aplicação construída. Pois onde ele está quem fosse utilizar a aplicação (supondo que outra pessoa fosse), teria que possuir esses arquivos no diretório C:\Java\hsqldb\demo\ do computador delas, certo?

Novamente muito obrigado pela atenção!

Basta alterar o caminho do banco na sua conexão:
Connection c = DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/xdb”, “SA”, “”);

Quer dizer que se eu usar a URL “jdbc:hsqldb:hsql://localhost/xdb” ao invés de :file: ele irá administrar o banco internamente no projeto? eu poderei compilar a minha aplicação sem me preocupar com mais nada, nem importar mais arquivo nenhum, etc? E dessa forma ele continuaria sendo Standalone ou se tornaria Web?

Eu tentei criar um banco com esse path e mudar o getConnection para essa nova URL e não deu certo. Ao criar o banco ele dá o seguinte erro:

java.sql.SQLException: socket creation error

(consequentemente a conexão no aplicativo falha)

Eu estava lendo a documentação (de novo), e esse tipo de URL (:hsql://localhost/…) é pra quando tem um servidor, não é não?

Eu só destaquei qual trecho você deveria alterar. Aquela URL não é a certa, era só um exemplo qualquer, tirado da documentação.

Você provavelmente terá que fixar uma pasta para seu banco de dados, ou configurar o caminho dele no instalador. Um dos problemas do Java desktop, na minha opinião, é que ele não entende o conceito de “pasta onde o executável está rodando”.

Não existe maneira confiável de saber isso.

Eu geralmente faço o script do instalador gravar uma variável de ambiente com o caminho da aplicação. E leio essa variável no java, através do System.getenv(). A partir daí, é fácil montar o caminho do banco.

Agora eu entendi o que você quis dizer. Então eu terei que criar um INSTALADOR para o meu programa, que vai criar uma pasta onde ficarão armazenados os arquivos do :file:, certo? ou é preferível que eu rode no modo Servidor como você me disse?

E como eu faço um instalador pro meu aplicativo? Eu digo, compilando o meu projeto eu tenho um .JAR… como eu crio um EXE ou qualquer outro tipo de executável que, eu mandando pra alguém, a pessoa instale o programa e já configure uma pasta fixa pro banco?

PS:… Onde eu encontro um tutorial para [quote]gravar uma variável de ambiente com o caminho da aplicação[/quote] ?