Olá, a todos!
Estou encontrando tal erro (Erro Parameter index out of ranger (2 number of parameter which is 1)) e depois de sofrer por um tempo tive que pedir ajuda ao pessoa do guj.
meu problema é o seguinte:
Enquanto estudando tentei criar um metodo que faz saque em uma conta, mas antes verifica se o saldo é maior que o valor do saque. ficou assim =>
public boolean sacarContaCorrente(int numConta, double valor) throws SQLException {
String sql = “select * from contacorrente where numConta = ?”;
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, numConta);
stmt.setDouble(2, valor);
ResultSet rs = stmt.executeQuery();
double saldo = 0;
if (rs.next()){
saldo = rs.getDouble("saldo");
if(saldo > valor){
saldo -= valor;
String sql2 = "update contacorrente set saldo=? where numConta=?";
PreparedStatement stmt2 = conn.prepareStatement(sql2);
stmt2.setDouble(1, saldo);
stmt2.setInt(2, numConta);
stmt2.executeUpdate();
return true;
}
}
rs.close();
stmt.close();
conn.close();
return false;
}
================ então é que esse erro aparece!!!
eu não sei se é porque fiz mal esse metodo ou qualquer outra coisa.
e se alguém poder dá uma ideia descente de como fazer esse metodo agredeço.
===== se alguém poder dar uma força aí agradeço e já vou me desculpando pelo incomodo.
Consegui dee altuma forma!
A consulta que você realiza no início do método era o problema, onde você define dois parâmetros para a query SQL sendo que a mesma só espera um!
Veja que aqui o único parâmetro esperado é o número da conta.
E aqui você passa os 2 parâmetros para a query SQL onde deveria passar somente o primeiro.
entendo. mas depois depois tentei tirar e não deu certo!
talvez tivesse fazendo mais algo errado.
consegui fazer depois fazendo um metodo com retorno double só para pegar o saldo atual e depois usei um if para verificar se era maior se que o valor de saque. ficou assim
public double pegaSaldo(int conta) throws SQLException {
String sql = “select * from contacorrente where numConta = ?”;
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, conta);
ResultSet rs = stmt.executeQuery();
double saldo = 0;
if (rs.next()) {
saldo = rs.getDouble("saldo");
}
return saldo;
}
e o sacar ficou asssim
public void sacarContaCorrente(int numConta, double valor) throws SQLException {
double saldo = 0;
String sql = "select * from contacorrente where numConta = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, numConta);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
saldo = rs.getDouble("saldo");
saldo -= valor;
String sql2 = "update contacorrente set saldo=? where numConta=?";
PreparedStatement stmt2 = conn.prepareStatement(sql2);
stmt2.setDouble(1, saldo);
stmt2.setInt(2, numConta);
stmt2.executeUpdate();
}
rs.close();
stmt.close();
conn.close();
o main ficou assim …
================
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
try {
int conta = Integer.parseInt(txtConta.getText());
double valor = Double.parseDouble(txtValor.getText());
ContaDAO cdao = new ContaDAO();
if(cdao.pegaSaldo(conta) >= valor){
cdao.sacarContaCorrente(conta, valor);
JOptionPane.showMessageDialog(this, "Sucesso");
}else{
JOptionPane.showMessageDialog(this, "Saldo Insuficiente");
}
} catch (SQLException ex) {
Logger.getLogger(Sacar.class.getName()).log(Level.SEVERE, null, ex);
}
}
====================== não sei se é a melhor forma de fazer, mas funcionou. Ainda assim agradeço pelo comentário!!!