Maldito access!RESOLVIDO

14 respostas
knik
Faço tudo certinho no postgres e oracle, mas o código abaixo insiste em não funcionar no access:
public static void main(String[] args) {
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
			String db = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/meuBanco.mdb";  
			Connection con = DriverManager.getConnection(db);
			String sql = "insert into MINHA_TABELA(ID,DESCRICAO,IDENTIDADE) values(1,'teste','999999999')";
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.execute();
			con.commit();			
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		}
	}
Que legal né? E ainda por cima não printa nenhum erro. E o que é pior: o código abaixo funciona!
public static void main(String[] args) {
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
			String db = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/meuBanco.mdb";  
			Connection con = DriverManager.getConnection(db);
			String sql = "Select * from MINHA_TABELA";
			PreparedStatement stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				System.out.println(rs.getString("IDENTIDADE"));
			}
		
			
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		}
	}
Resumindo: executa qualquer consulta (leitura), mas não executa insert/update ou delete (escrita) e não printa erro (conexão ocorre normalmente). E ainda não vi lugar algum para conceder permissão de escrita no banco (uma vez que o mesmo não tem usuario e senha). A versão do Access é a 2007.

Alguém poderia me ajudar?

14 Respostas

ViniGodoy

Já tentou rodar essa consulta no modo query do próprio access?
Geralmente lá ele dá uma mensagem de erro mais clara.

robinsonbsilva

Jovem,
Nesse link existe um tutorial de como estabelecer uma conexão com o access 2007 (http://www.linglom.com/2009/08/31/accessing-ms-access-2007-on-netbeans-6-5-using-jdbc-part-3-create-a-connection/)

Vê se ajuda!!

knik

Acabei de fazer isto agora.
Dentro do access funciona uma simples query assim, fora dele, pelo aplicativo, nem mensagem de erro…
Vou tentar a versão anterior do access…

knik

…NADA,
com a versão anterior do acess é o mesmo comportamento.
Será que é o driver?
Será que o código tá errado?
Alguém me ajude!

knik

Jovem, Nesse link existe um tutorial de como estabelecer uma conexão com o access 2007 (http://www.linglom.com/2009/08/31/accessing-ms-acc...bc-part-3-create-a-connection/)
OK, o link estah mostrando a mesma coisa que eu fiz (idêntico).
Não é problema de conexão - ela ocorre normalmente, tanto que está funcionando a consulta do segundo código que eu postei.

robinsonbsilva

:shock:

Cara, que bizarro!!

Por acaso existe algum grant configurado para essa tabela??

Se possível, execute essa rotina com o .mdb fechado(apenas pelo java). Já tive caso de estar executando através da aplicação e o .mdb estava aberto pelo Access(esse abria e deixava o banco read only) para outras “conexões”

knik

Cara, eh muito bizarro mesmo.
Nunca usei access mas o aplicativo aqui tem de ser ele (foi imposto).
Você poderia experimentar e fazer um teste aí?
Será que é só comigo que estah acontecendo isto (uma vez que ninguém reclamou ainda)?
Será a minha JVM? (1.6.0_11) (muito pouco provável).

robinsonbsilva

Posso tentar sim!
zipa aí e me passa para o email cadastrado em meu perfil

knik

Caramba, nem dá para acreditar.
Foi resolvido colocando as linhas abaixo após o commit:

stmt.close(); con.close();
Fechar o statement vá lá, até concordo, mas a conexão também? e se eu quiser manter a conexão aberta, não vai funcionar?
De qualquer forma muito obrigado a todos.

robinsonbsilva

eu hein!!

No link que passei eles fecham a conexão também!!
O access tem esse problema de concorrência de acesso! Já tive muitas dores de cabeça!!

felipehand

A questao de fechar a conexao é o seguinte… sofri um pouco com isso…
Quando vc abre uma conexao com o access ele cria um arquivo de bkp no mesmo diretorio do banco.
Ele internamente só comita depois que voce fecha a conexao, pq ele mata o arquivo de bkp e atualiza o original.
É extremamente grotesco, mas é a forma dele “garantir” os dados.

knik

Eh isto!!!
Verifiquei no meu diretorio a existência do infame arquivo de backup.
Fazer o que né…

felipehand

Existem coisas que só a Microsoft faz por vc :wink:

ViniGodoy

Uma dica.

É importantíssimo fechar tanto a conexão, quando os statements, sempre que você rodar consultas com o banco de dados. Por isso, eu sugiro que você trabalhe com o CachedRowSet ao invés do ResultSet, e que você faça esses fechamentos no finally.

Caso contrário outros problemas bizarros podem acontecer.

Ah! Não adianta só dar close na conexão e achar que isso fechou todos os statements. Alguns bancos implementam caches de conexão e podem manter a conexão aberta, caso os statements se mantenham abertos também.

Por isso, por padrão, sua aplicação sempre deve manter a conexão fechada. A cada SELECT, UPDATE, etc, abra a conexão, faça o que tenha que fazer, e feche a conexão (e os statements) o mais rapidamente possível.

Alguns frameworks já implementam esse comportamento por padrão, como é o caso do Spring.

Criado 4 de setembro de 2009
Ultima resposta 4 de set. de 2009
Respostas 14
Participantes 4