Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro em depositar

Após baixar pelo Github o código completo e atualizado fornecido, alterando e configurando o banco de dados, e verifiquei que esta lendo o banco e listando as contas certinho, porem, mesmo depois de realizar os ajustes ou tentar pelo código fornecido após o termino desde modulo, que seria o byte_bank4 pelo GitHub, a parece o seguinte erro ao tentar depositar.

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). at br.com.alura.bytebank.domain.conta.ContaDAO.listarPorNumero(ContaDAO.java:104) at br.com.alura.bytebank.domain.conta.ContaService.buscarContaPorNumero(ContaService.java:69) at br.com.alura.bytebank.domain.conta.ContaService.realizarDeposito(ContaService.java:50) at br.com.alura.bytebank.BytebankApplication.realizarDeposito(BytebankApplication.java:134) at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:36) Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) at com.mysql.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1345) at com.mysql.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1358) at com.mysql.cj.jdbc.ClientPreparedStatement.setInt(ClientPreparedStatement.java:1536) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setInt(HikariProxyPreparedStatement.java) at br.com.alura.bytebank.domain.conta.ContaDAO.listarPorNumero(ContaDAO.java:84) ... 4 more

Process finished with exit code 1

fiz o teste com o código fornecido no GitHub de estagio 3 e 4, e os dois dao o mesmo erro.

2 respostas
solução!

Olá, William! Tudo bem?

Pelo que você descreveu, o erro que você está enfrentando é um java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). Isso geralmente ocorre quando você está tentando acessar um parâmetro que não foi definido na sua consulta SQL.

O erro parece estar ocorrendo no método listarPorNumero da classe ContaDAO. Provavelmente, você está tentando definir um parâmetro para sua consulta SQL, mas a consulta em si não tem nenhum placeholder para parâmetros.

Em outras palavras, em algum lugar no seu código, você deve ter algo parecido com isso:

PreparedStatement ps = conn.prepareStatement("SUA CONSULTA SQL");
ps.setInt(1, algumValor);

O problema é que "SUA CONSULTA SQL" não contém nenhum ?, que é o que o PreparedStatement usa como placeholder para parâmetros. Então, quando você tenta definir o primeiro parâmetro com ps.setInt(1, algumValor), ele lança a exceção porque não há primeiro parâmetro na sua consulta.

Para solucionar isso, você precisa incluir um ? na sua consulta SQL para cada parâmetro que você deseja definir. Por exemplo:

PreparedStatement ps = conn.prepareStatement("SELECT * FROM Conta WHERE numero = ?");
ps.setInt(1, algumValor);

Nesse caso, o ? é o placeholder para o valor que você define com ps.setInt(1, algumValor).

Verifique o método listarPorNumero na classe ContaDAO e certifique-se de que sua consulta SQL tem um ? para cada parâmetro que você está tentando definir.

Espero ter ajudado e bons estudos!

Bom dia amigo, muito obrigado pela informação, eu baixei o codigo fornecido que estava no github, porem nele o metodo listar na contaDAO esta assim:

public Conta listarPorNumero(Integer numero) { String sql = "SELECT * FROM conta WHERE numero = " + numero + " and conta_ativa = true ";

    PreparedStatement ps;
    ResultSet resultSet;
    Conta conta = null;
    try {
        ps = conn.prepareStatement(sql);
        ps.setInt(1, numero);
        resultSet = ps.executeQuery();

        while (resultSet.next()) {
            Integer numeroRecuperado = resultSet.getInt(1);
            BigDecimal saldo = resultSet.getBigDecimal(2);
            String nome = resultSet.getString(3);
            String cpf = resultSet.getString(4);
            String email = resultSet.getString(5);

            DadosCadastroCliente dadosCadastroCliente =
                    new DadosCadastroCliente(nome, cpf, email);
            Cliente cliente = new Cliente(dadosCadastroCliente);

            conta = new Conta(numeroRecuperado, saldo, cliente);
        }
        resultSet.close();
        ps.close();
        conn.close();
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
    return conta;
}

Ápos as suas valiosas inormaçoes, eu alterei a String para:

String sql = "SELECT * FROM conta WHERE numero = ? ";

e agora o codigo compila, roda e funciona perfeitamente!

Muito obrigado pela imenssa ajuda!

Teria alguma sugestao para quando esses problemas surgirem, o que seria o mais viavel para solucionar, qualquer problema de forma geral na area.