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.
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.
oi
Voce pode tentar o seguinte
onde conn é a sua java.sql.Connection
[]´s
mas como eu vou saber se a query roda?
capture a sqlexception se acontecer…
Da pra utilizar http://hsqldb.org/ ele sobe um banco de dados em memória… ai vc executa a query e testa.
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;
}
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
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;
}
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
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