Metodo para testar a query

9 respostas
A

Bom dia,

tenho um metodo alterar no meu DAO que ele deleta tudo da tabele, depois insere o que vier da servlet.

gostaria de saber se tem um metodo para testar uma query sem que ela execute no banco.

tipo:

testaQuery(“insert …”);

muito obrigado.

9 Respostas

A

oi

Voce pode tentar o seguinte

onde conn é a sua java.sql.Connection

[]´s

A

mas como eu vou saber se a query roda?

A

capture a sqlexception se acontecer…

B

Da pra utilizar http://hsqldb.org/ ele sobe um banco de dados em memória… ai vc executa a query e testa.

A

estou tentando aqui:

esse é o metodo q funciona + nao checa a query:

public boolean alterar(ReinoVO reino, int idtSistema, String usrPessoa)
            throws SQLException, FileNotFoundException, IOException {
        boolean sucesso = false;
        String query = "";

        try {
            if (excluirTodasTraducoes(reino.getId(), idtSistema, usrPessoa)) { // o metodo excluirTodasTraduçoes tem q ser executado so se o insert estiver ok 
                query = "INSERT INTO ta_idioma_reino (cod_reino, cod_idioma, usr_idioma_reino_cad, dta_idioma_reino_cad, sgl_reino, nme_reino) " +
                        "VALUES (?, ?, ?, ?, ?, ?)";
                PreparedStatementLogable  ops = new PreparedStatementLogable(this.getCnn(), query);

                ArrayList<IdiomaReinoVO> idiomasReino = reino.getIdiomasReino();
                for (Iterator<IdiomaReinoVO> it = idiomasReino.iterator(); it.hasNext();) {
                    IdiomaReinoVO idiomaReinoVO = it.next();
                    ops.setInt(1, reino.getId().intValue());
                    ops.setInt(2, idiomaReinoVO.getCodIdioma());
                    ops.setString(3, idiomaReinoVO.getUsrCad());
                    ops.setString(4, idiomaReinoVO.getDtaCad());
                    ops.setString(5, idiomaReinoVO.getSglReino());
                    ops.setString(6, idiomaReinoVO.getNmeReino());

                    String dsc_operacao = ops.toString();

                    if (ops.executeUpdate() != 1) {
                        return false;
                    }
                    this.recordLog(ops, idtSistema, dsc_operacao, idiomaReinoVO.getUsrCad());
                }
                ops.close();
            } else {
                return false;
            }
            sucesso = true;
        } catch (Exception ex) {
            this.recordError("Erro ao alterar reino id= " + reino.getId(), ex);
        }
        return sucesso;
    }

e esse é oq eu realmente quero so que quando eu faço o executeUpdate(); ele cai na Exception

public boolean alterar2(ReinoVO reino, int idtSistema, String usrPessoa)
            throws SQLException, FileNotFoundException, IOException {
        boolean sucesso = false;
        String query = "";

        this.getCnn().setAutoCommit(false);
        try {
           
                query = "INSERT INTO ta_idioma_reino (cod_reino, cod_idioma, usr_idioma_reino_cad, dta_idioma_reino_cad, sgl_reino, nme_reino) " +
                        "VALUES (?, ?, ?, ?, ?, ?)";
                PreparedStatementLogable  ops = new PreparedStatementLogable(this.getCnn(), query);

                ArrayList<IdiomaReinoVO> idiomasReino = reino.getIdiomasReino();
                for (Iterator<IdiomaReinoVO> it = idiomasReino.iterator(); it.hasNext();) {
                    IdiomaReinoVO idiomaReinoVO = it.next();
                    ops.setInt(1, reino.getId().intValue());
                    ops.setInt(2, idiomaReinoVO.getCodIdioma());
                    ops.setString(3, idiomaReinoVO.getUsrCad());
                    ops.setString(4, idiomaReinoVO.getDtaCad());
                    ops.setString(5, idiomaReinoVO.getSglReino());
                    ops.setString(6, idiomaReinoVO.getNmeReino());

                    String dsc_operacao = ops.toString();

                    ops.executeUpdate();
                    
                    this.recordLog(ops, idtSistema, dsc_operacao, idiomaReinoVO.getUsrCad());
                }
                ops.close();

            if (excluirTodasTraducoes(reino.getId(), idtSistema, usrPessoa)) {
            this.getCnn().commit();
            } else {
                return false;
            }
            sucesso = true;
        } catch (Exception ex) {
            this.recordError("Erro ao alterar reino id= " + reino.getId(), ex);
        }
        return sucesso;
    }
A

oi,

não vi diferença entre os dois métodos, acho que já sei o que você quer, além de tentar executar a query você precisa saber qual query foi executada certo?

você pode fazer isso usando um debug e setando um break-point nesta linha, ai você pega os valores dos atributos, substitui na query e executa…

se quiser ver isso no log com o preparedstatement ele irá jogar o caractere interrrogação, mas tem uma forma de se resolver isso, é usar um tal de p6spy

ele captura a sql gerada e no log você irá ter os valores passados para a query

para configurar ele basta colocar no seu arquivo de configuração do banco apontando para o driver dele e depois configurar no spy.properties o driver real do banco

[]´s

A

André

vlww msm pela ajuda

vou tentar me expressar melhor

vou colocar aqui os 2 metodos e tentas explicar o problema.

public boolean alterar(ReinoVO reino, int idtSistema, String usrPessoa)
            throws SQLException, FileNotFoundException, IOException {
        boolean sucesso = false;
        String query = "";

        try {
            if (excluirTodasTraducoes(reino.getId(), idtSistema, usrPessoa)) { // metodo que exclui tudo
                query = "INSERT INTO ta_idioma_reino (cod_reino, cod_idioma, usr_idioma_reino_cad, dta_idioma_reino_cad, sgl_reino, nme_reino) " +
                        "VALUES (?, ?, ?, ?, ?, ?)";//antes de exucutar o metodo de excluir eu tenho q testar a query p ver se ela roda e depois executa-la.
//Ficaria assim:
//testeQuery sem executa-la.
//metedoExcuir.
//Executar query.

                PreparedStatementLogable  ops = new PreparedStatementLogable(this.getCnn(), query);

                ArrayList<IdiomaReinoVO> idiomasReino = reino.getIdiomasReino();
                for (Iterator<IdiomaReinoVO> it = idiomasReino.iterator(); it.hasNext();) {
                    IdiomaReinoVO idiomaReinoVO = it.next();
                    ops.setInt(1, reino.getId().intValue());
                    ops.setInt(2, idiomaReinoVO.getCodIdioma());
                    ops.setString(3, idiomaReinoVO.getUsrCad());
                    ops.setString(4, idiomaReinoVO.getDtaCad());
                    ops.setString(5, idiomaReinoVO.getSglReino());
                    ops.setString(6, idiomaReinoVO.getNmeReino());

                    String dsc_operacao = ops.toString();

                    if (ops.executeUpdate() != 1) {
                        return false;
                    }
                    this.recordLog(ops, idtSistema, dsc_operacao, idiomaReinoVO.getUsrCad());
                }
                ops.close();
            } else {
                return false;
            }
            sucesso = true;
        } catch (Exception ex) {
            this.recordError("Erro ao alterar reino id= " + reino.getId(), ex);
        }
        return sucesso;
    }

se a queryIncluir falhar, apenas o metodo de excluir sera executado ocasionando o erro.

Metodo que exclui

public boolean excluirTodasTraducoes(Integer idtReino, int idtSistema, String usrPessoa)
            throws SQLException, FileNotFoundException, IOException {

        boolean sucesso = false;
        String query = "DELETE FROM ta_idioma_reino " +
                "WHERE cod_reino=?";

        PreparedStatementLogable ps = new PreparedStatementLogable(this.getCnn(), query);

        ps.setInt(1, idtReino.intValue());

        String dsc_operacao = ps.toString();
        try {
            if (ps.executeUpdate() > -1) {
                sucesso = true;
            }
           
            if (sucesso) {
                this.recordLog(ps, idtSistema, dsc_operacao, usrPessoa);
            }
            ps.close();
        } catch (Exception ex) {
            this.recordError("Erro ao tentar excluir traducoes para " +
                    "reino de id " + idtReino, ex);
        }

        return sucesso;
    }
A

você só quer executar o excluir se o incluir funcionar certo?

você pode tentar simulando uma transação, algo parecido com isso

boolean sucesso=false;

try {
	conexao.setAutoCommit(false);
	
	// executar query incluir
	
	// executar query excluir
	
	sucesso=true;
	
catch (SQLExceptioin e) {
	// erro executando consulta 
	e.printStackTrace();
}
finally {
	conexao.commit();
}

se o incluir der erro vai cair no catch de SQLException e não vai executar a segunda query (que é feito no finally)

veja se isso atende ao que você precisa..

edit: escrevi errado, o commit no banco sempre será feito porque está no finally

A

olha como fico :

public boolean alterar(ReinoVO reino, int idtSistema, String usrPessoa)

throws SQLException, FileNotFoundException, IOException {

boolean sucesso = false;
this.getCnn().setAutoCommit(false);
    String query = "";
    String queryExclui = "";
    try {
            queryExclui = "DELETE FROM ta_idioma_reino WHERE cod_reino= ?";
            query = "INSERT INTO ta_idioma_reino (cod_reino, cod_idioma, usr_idioma_reino_cad, dta_idioma_reino_cad, sgl_reino, nme_reino) " +
                    "VALUES (?, ?, ?, ?, ?, ?)";

            //delete
            PreparedStatementLogable  opsDelete = new PreparedStatementLogable(this.getCnn(), queryExclui);
            opsDelete.setInt(1, reino.getId());

            opsDelete.executeUpdate();

            //insert
            PreparedStatementLogable  ops = new PreparedStatementLogable(this.getCnn(), query);

            ArrayList<IdiomaReinoVO> idiomasReino = reino.getIdiomasReino();
            for (Iterator<IdiomaReinoVO> it = idiomasReino.iterator(); it.hasNext();) {
                IdiomaReinoVO idiomaReinoVO = it.next();
                ops.setInt(1, reino.getId().intValue());
                ops.setInt(2, idiomaReinoVO.getCodIdioma());
                ops.setString(3, idiomaReinoVO.getUsrCad());
                ops.setString(4, idiomaReinoVO.getDtaCad());
                ops.setString(5, idiomaReinoVO.getSglReino());
                ops.setString(6, idiomaReinoVO.getNmeReino());

                String dsc_operacao = ops.toString();

                if (ops.executeUpdate() != 1) {
                    return false;
                }
                this.recordLog(ops, idtSistema, dsc_operacao, idiomaReinoVO.getUsrCad());
            }
            this.getCnn().commit();
            ops.close();
     
        sucesso = true;
    } catch (Exception ex) {
        this.getCnn().rollback();
        this.recordError("Erro ao alterar reino id= " + reino.getId(), ex);
    }
    this.getCnn().setAutoCommit(true);
    return sucesso;
}

agora funciona perfeitamente!

vlw gente
abraço

Criado 20 de novembro de 2010
Ultima resposta 22 de nov. de 2010
Respostas 9
Participantes 3