PreparedStatment e Calendar

Prezados!

Estou com dificuldade para inserir dados em uma tabela, o erro é o seguinte:

[color=red]java.sql.SQLException: No value specified for parameter 12 [/color] :oops:

todos os parametros estão preenchidos, porém eu imagino que seja a data, Alguém podedar uma luz, por favor?

segue o código:

Request.getParamiter

package ClassesProjetoLogica;

import java.io.IOException;
import java.sql.Connection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import AplicBD.Cad_Cliente_DAO;
import Contratos.Logica;
import Modelo.Cad_Cliente;

public class Cadastro_Cliente implements Logica {

	@Override
	public void executa(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String nome = request.getParameter("nome").trim();
		String email = request.getParameter("email").trim();
		String endereco = request.getParameter("endereco").trim();
		String cep = request.getParameter("cep").trim();
		String bairro = request.getParameter("bairro").trim();
		String cidade = request.getParameter("cidade").trim();
		String estado = request.getParameter("estado").trim();
		String pais = request.getParameter("pais").trim();
		String complemento = request.getParameter("complemento").trim();
		String telefone = request.getParameter("telefone").trim();
		String data_texto = request.getParameter("dataCadastro").trim();

		Calendar data_nova = null;

		try {
			Date date = new SimpleDateFormat("dd/MM/yyyy").parse(data_texto);
			data_nova = Calendar.getInstance();
			data_nova.setTime(date);
		} catch (ParseException e) {
			System.out.println("Erro ao converter a Data!");
		}
		
		Cad_Cliente cliente = new Cad_Cliente();

		cliente.setNome(nome);
		cliente.setEmail(email);
		cliente.setEndereco(endereco);
		cliente.setCep(cep);
		cliente.setBairro(bairro);
		cliente.setCidade(cidade);
		cliente.setEstado(estado);
		cliente.setPais(pais);
		cliente.setComplemento(complemento);
		cliente.setTelefone(telefone);
		cliente.setData_cadastro(data_nova);

		Connection connection = (Connection) request.getAttribute("conexao");
		Cad_Cliente_DAO cli_dao = new Cad_Cliente_DAO(connection);
		cli_dao.Cadastar_Cliente(cliente);

		RequestDispatcher rd = request.getRequestDispatcher("/sucesso.jsp");
		rd.forward(request, response);

	}

}

Código DAO

package AplicBD;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import Modelo.Cad_Cliente;

public class Cad_Cliente_DAO {

	private Connection connection;

	public Cad_Cliente_DAO(Connection connection) {
		this.connection = connection;
	}

	public void Cadastar_Cliente(Cad_Cliente cliente) {

		String sql = "insert into clientes(nome, email, endereco, cep, bairro, cidade, estado,"
				+ "pais, complemento, telefone, data_cadastro)values(?,?,?,?,?,?,?,?,?,?,?,?)";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, cliente.getNome());
			stmt.setString(2, cliente.getEmail());
			stmt.setString(3, cliente.getEndereco());
			stmt.setString(4, cliente.getCep());
			stmt.setString(5, cliente.getBairro());
			stmt.setString(6, cliente.getCidade());
			stmt.setString(7, cliente.getEstado());
			stmt.setString(8, cliente.getPais());
			stmt.setString(9, cliente.getComplemento());
			stmt.setString(10, cliente.getTelefone());
                        stmt.setDate(11, new java.sql.Date(cliente
					.getData_cadastro().getTimeInMillis())); 

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

vlw!!! :?

Olá Alexandre. O erro é exatamente o que a mensagem diz. Não há nenhum valor para o parâmetro 12.
Você só tem 11 atributos. Remova um dos parâmetros (pontos de interrogação) da SQL do método ‘Cadastar_Cliente()’.

Se tiver problemas com a data que é o parâmetro 11, tente usar assim:

stmt.setDate(11, new java.sql.Date(cliente.getData_cadastro()));

Outra dica é dar uma olhada nas convenções Java. Sua classe deveria se chamar CadastroClienteDAO e Cliente (evitando abreviações e sendo mais claro), seguindo o padrão camel case mas com a inicial maiúscula. Seus métodos e variáveis também deveriam estar no padrão camel case, como cadastrarCliente().

=]

Esta dizendo que está faltando vc passar o valor do parametro 12…

Na verdade você nessa String está pedindo 12 parâmetros

String sql = "insert into clientes(nome, email, endereco, cep, bairro, cidade, estado," + "pais, complemento, telefone, data_cadastro)values(?,?,?,?,?,?,?,?,?,?,?,?)";

Porém, nesse comando você está passando apenas 11…

[code]try {
PreparedStatement stmt = connection.prepareStatement(sql);

        stmt.setString(1, cliente.getNome());  
        stmt.setString(2, cliente.getEmail());  
        stmt.setString(3, cliente.getEndereco());  
        stmt.setString(4, cliente.getCep());  
        stmt.setString(5, cliente.getBairro());  
        stmt.setString(6, cliente.getCidade());  
        stmt.setString(7, cliente.getEstado());  
        stmt.setString(8, cliente.getPais());  
        stmt.setString(9, cliente.getComplemento());  
        stmt.setString(10, cliente.getTelefone());  
                    stmt.setDate(11, new java.sql.Date(cliente  
                .getData_cadastro().getTimeInMillis()));   

        stmt.execute();  
        stmt.close();  

    } catch (SQLException e) {  
        throw new RuntimeException(e);  
    }  [/code]

Fala frederico, obrigado pela dica era isso mesmo… Quanto ao padrão, é verdade eustou um pouco fora kkk, confeço que estou um pouco acostumado com esse modo de escrever… Obrigado pela dica. Boas Festas!

Obrigado a Todos! :slight_smile: