Posso utilizar ResultSets para atualizar banco em ACCESS?

1 resposta
diego_qmota

Posso utilizar resultsets para atualizar registros de um banco em ACCESS?

Estou colocando o código abaixo para exemplificar o que estou tentando fazer:

PreparedStatement ps = getConexao().prepareStatement(
                    "SELECT * FROM Cadastro WHERE Depto = ?;",
                    ResultSet.TYPE_SCROLL_SENSITIVE,
                    ResultSet.CONCUR_UPDATABLE );

ps.setString(1, usuario.getDepto());

ResultSet rs = ps.executeQuery();

while (rs.next()) {

    rs.updateString(3, "Vendas");     //a coluna de atualização está correta
    rs.updateRow();

}

O motivo de usar este método é que estou manipulando um array de objetos e para alguns objetos podem haver alterações no banco e para outros não.
Por isso achei que era melhor usar um resultset para, nos registros que eu realmente precisar atualizar, usar o resultset para isso.
Quando eu rodo meu código, que é bem maior que o exemplo acima, ocorre o seguinte erro (na linha onde eu dou o rs.updateRow() :

java.sql.SQLException: [Microsoft][Driver ODBC para Microsoft Access]Erro na linha
        at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(JdbcOdbcResultSet.java:5271)
        at sun.jdbc.odbc.JdbcOdbcResultSet.updateRow(JdbcOdbcResultSet.java:4171)
        at diegoqueres.ferramentas.carteiraipf.GerenciadorBancoDados.alterarEmpresas(GerenciadorBancoDados.java:105)
        at diegoqueres.ferramentas.carteiraipf.Empresa.gravarAlteracoesEmpresas(Empresa.java:97)
        at diegoqueres.ferramentas.carteiraipf.JanelaInclusaoAlteracao.jButtonSubmeterActionPerformed(JanelaInclusaoAlteracao.java:609)
        at diegoqueres.ferramentas.carteiraipf.JanelaInclusaoAlteracao.access$600(JanelaInclusaoAlteracao.java:29)
        at diegoqueres.ferramentas.carteiraipf.JanelaInclusaoAlteracao$6.actionPerformed(JanelaInclusaoAlteracao.java:303)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6038)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

1 Resposta

diego_qmota

Pessoal…descobri qual a solução desse problema… e o pior, é muito fácil de resolver…

Mas o problema é que é algo difícil de você perceber que seria a causa de tantos problemas…:

Vou postar aqui para todos que tiverem o mesmo problema, saberem onde procurar.

Esse erro se dá devido ao driver odbc que você especifica quando cria a conexão:

URL = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" +
                        "DBQ=" + localizacaoBanco + nomeBanco + ".mdb;";

              URL += "DriverID=22;READONLY=FALSE;";

Dependendo do driver, ele não dá suporte para ResultSets atualizáveis e daí ocasiona o erro. No caso, eu estava usando o [color=red]DriverID=22[/color] do qual não fazia nem idéia que era um driver vagabundo que não dava suporte pra nada… (eheheeh). Pesquisei na internet por dias e não achei nada que indicasse que o indômito driver era o grande culpado!

Só foi tirar esse troço da string de conexão e pronto…já posso atualizar!

Muito obrigado e fica aqui a solução. Caso aconteça esse erro, cheque:

  • a string de conexão e [color=brown]O FAMIGERADO DRIVER ID[/color];
  • se você está atualizando um campo de um tipo, com método update de outro tipo. Por exemplo, rs.updateString para campos que no bd são tipos numéricos;
  • se o seu bd do access está corrompido.
Criado 22 de agosto de 2009
Ultima resposta 24 de ago. de 2009
Respostas 1
Participantes 1