Eu não sei mais o que fazer, e preciso de uma ajuda. Estou criando um programa que gera relatórios com informações trazidas de uma base de dados do banco, mas eu não sei o que acontece, que o programa só retorna todos os valores se eu utilizar variáveis internas da função.
Qualquer variável externa inserida executa o loop apenas uma vez, e eu PRECISO utilizar as informações retornadas em outras finalidades.
Uma breve explicação do código:
*Existe uma base de dados, com duas colunas, “contagem” (que armazena um contador crescente) e “duração” (que armazena em string tempo cronometrado);
Existe um trecho de código em comentário. Esse trecho de código é o que funciona, somente com as variáveis internas. O trecho sem comentar, é o trecho que não funciona o loop perfeitamente
public void recuperaligacoes() {
/RECUPERA O REGISTRO DE LIGAÇÕES DA TABELA/
recuperacontagem(); // traz o valor máximo da coluna "contagem"
try {
int cast, resultado = getResultado(), i, num = getResultado();
String resultadotabela[] = new String[getResultado()];
System.out.println("Contagem \t Tempo \n");
/* for (i = 0, cast = 1; i <= num && cast <= resultado; i++, cast++) {
String sql = "SELECT duracao from ligacao where contagem ='" + cast + "';";
PreparedStatement stmt = connection.prepareStatement(sql);
rs = stmt.executeQuery();
while (rs.next()) {
resultadotabela[i] = rs.getString("duracao");
System.out.println(cast + "\t\t" + resultadotabela[i] + "\n");
stmt.close();
}
}*/
for (cast = 1; cast <= resultado; cast++) {
String sql = "SELECT duracao from ligacao where contagem ='" + cast + "';";
PreparedStatement stmt = connection.prepareStatement(sql);
rs = stmt.executeQuery();
for (i = 0; i <= num; i++) {
while (rs.next()) {
resultadotabela[i] = rs.getString("duracao");
System.out.println(cast + "\t\t" + resultadotabela[i] + "\n");
stmt.close();
}
teste[i]=resultadotabela[i]; //variável teste é global, parametrizada com o campo "resultado", que traz o valor máximo da coluna "contagem"
System.out.println(teste[i]);
}
}
} catch (Exception e) {
}
}
Por favor, alguém poderia me dar uma luz nesse problema, pois não sei mais o que fazer, nem como jogar o resultado para uso em outra função.
tem 2 coisas erradas neste trecho,
1 - Você não precisa do for externo simplesmente declarar um int i=0 e dentro do While dar i++;
2 - stmt.close(); tem que ser chamado de fora do while, você esta mandando fechar a conexão repetidas vezes, sinceramente eu nem mesmo sei o que isso pode ocasionar.
Nunca faça um for de executeQuery(), você esta criando varias conexões seguidas, isso deixara o pc onde esta seu banco de dados lento e muito provavelmente ele não retornará resultado.
Você poderia substituir essa Query por
"SELECT duracao from ligacao where contagem Between 1 and " + resultado +" '; "
É que você tem 2 laços um do-while mais externo e dentro dele tem um while que alimenta seu array.
Pra que serve o do-while externo?
Você está chamando o método getResultado() 3 vezes, o que esse método retorna?
Dá uma olhada se assim não atende sua necessidade:
// RECUPERA O REGISTRO DE LIGAÇÕES DA TABELA
public void recuperaligacoes() throws SQLException {
int resultado = getResultado(); // o que esse método retorna? resultado do que?
String resultadotabela[] = new String[resultado];
recuperacontagem(); // o que esse método faz?
System.out.println("Contagem \t Tempo \n");
String sql = "SELECT duracao from ligacao where contagem between 1 and ? ";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setInt(1, resultado);
ResultSet rs = stmt.executeQuery();
int i = 0;
while (rs.next()) {
resultadotabela[i] = rs.getString("duracao");
System.out.println(i + "\t\t" + resultadotabela[i] + "\n");
i++;
}
stmt.close();
}
Aí um membro da comunidade respondeu que estava abrindo mtas instâncias, e o ideal pro caso seria um do-while… foi o que eu fiz… hahaha
O getResultado() traz o resultado da leitura da query "“SELECT MAX(contagem) as contagem from ligacao;”;
Vou colocar o código aqui:
public int recuperacontagem() {
Codigos co = new Codigos();
String sql = "SELECT MAX(contagem) as contagem from ligacao;";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
rs = stmt.executeQuery();
while (rs.next()) {
setResultado(rs.getInt("contagem"));
co.setContaparada(getResultado()); //contaparada pega o valor do resultado, e joga em outro método, que alimenta um contador automático
}
} catch (SQLException e) {
//Saída de erro para o usuário.
JOptionPane.showMessageDialog(null,
"Houve um erro ao selecionar os dados!",
"ERRO!",
JOptionPane.ERROR_MESSAGE);
//Saída de erro para o programador.
System.out.println("ERRO:(LigacaoDAO.recuperacontagem)" + e.getMessage());
}
System.out.println("valor de resultado puxado da base: " + getResultado());
//Retorna o resultado da execução SQL.
try {
if (getResultado() == 3) {
sql = "DELETE from ligacao;";
PreparedStatement stmt = connection.prepareStatement(sql);
rs = stmt.executeQuery();;
stmt.close();
}
} catch (SQLException e) {
//Saída de erro para o usuário.
JOptionPane.showMessageDialog(null,
"Houve um erro ao selecionar os dados!",
"ERRO!",
JOptionPane.ERROR_MESSAGE);
//Saída de erro para o programador.
System.out.println("ERRO:(LigacaoDAO.limpeza)" + e.getMessage());
}
System.out.println("valor de resultado puxado da base: " + getResultado());
//Retorna o resultado da execução SQL.{
return resultado;
}
engraçado é que quanto mais olho, mais começo a achar que meu código está mais zoneado que o Bahamas…rs
Exception in thread “AWT-EventQueue-0” java.lang.RuntimeException: Uncompilable source code - unreported exception java.sql.SQLException; must be caught or declared to be thrown
O método recuperacontagem() já faz isso, qual a necessidade de ter um setResultado() e getResultado()?
Pelo visto, nenhuma… haha Achei que era necessário, por conta de encapsulamento.
Que bom que percebeu, já é meio caminho pra melhorar.
Como se nota, eu sou meio crua em Java com BD…rs Já criei umas 8 versões do código todo, tentando buscar melhoria, mas sinto que em algumas coisas eu estou bem presa…rs