Exception in thread "main" java.lang.ClassCastException: java.util.Date

8 respostas
W
Olá pessoal, estou com problemas para persistir data no sql server. Vejam: A variável da minha classe
import java.util.Date;
private Date dataInclusao;

public Date getDataInclusao() {
  return dataInclusao;
}

public void setDataInclusao(Date dataInclusao) {
   this.dataInclusao = dataInclusao;
}
O DAO, onde está o código para inserção na tabela:
preparedStatement.setDate(5, (Date) harServerLibMud.getDataInclusao());

Com esse código acima, dá o seguinte erro:
[color=red]Exception in thread "main" java.lang.ClassCastException: java.util.Date
at com.br.harvest.dao.HarServerLibMudDaoImpl.incluirServidoresProjeto(HarServerLibMudDaoImpl.java:129)
at com.br.harvest.programas.HarInstallServers.executaProcessoBD(HarInstallServers.java:48)
at com.br.harvest.main.HarServerLibMudExecute.main(HarServerLibMudExecute.java:44)[/color]

Já tentei usar o seguinte:
preparedStatement.setTimestamp(5,harServerLibMud.getDataInclusao()); mas não é aceito pelo eclipse.[color=red]
The method setTimestamp(int, Timestamp) in the type PreparedStatement is not applicable for the arguments (int, Date)[/color]

preparedStatement.setDate(5,harServerLibMud.getDataInclusao());
[color=red]The method setDate(int, Date) in the type PreparedStatement is not applicable for the arguments int, Date) [/color]

Eu quero inserir a data atual na tabela e estou usando
dataInclusao = new Date();
esse é o valor que quero gravar na tabela.

Criei no banco de dados o campo de data da seguinte forma:
alter table HarServerLibMud
add DataInstalacao datetime;

Agradeço se puderem me dar uma ajuda.
abs.

8 Respostas

m0ska

Isso acontece, pq vc está tentando persistir um objeto da classe java.util.Date, quando na realidade deveria persistir um objeto da classe java.sql.Date
Então faz o seguinte. Olha os construtores da classe java.sql.Date que lá tem como vc converter de uma util.Date pra sql.Date

:wink:

W

Oi m0ska, com sua dica e umas pesquisas na net, até que funcionou, mas eu também preciso gravar a hora.
Resumindo, eu preciso inserir a data e hora em que o registro foi salvo na tabela.
Caso tenha uma forma melhor, gostaria que me mostrasse, por favor.
Vou mostrar como está agora, após as alterações.
A classe

import java.util.Date; private Date dataInclusao; public Date getDataInclusao() { return dataInclusao; } public void setDataInclusao(Date dataInclusao) { this.dataInclusao = dataInclusao; }

A data a ser gravada

dataInclusao = new Date(); java.sql.Date dataInclusaoSql = new java.sql.Date(dataInclusao.getTime());
O DAO que recebe a data passada anteriormente

Fiz um código de teste para recuperar a data

List<HarServerLibMud> lista = dao.obterListaServidoresPorProjetoPacote(harServerLibMud); for(HarServerLibMud var : lista){ System.out.println(var.getDataInclusao()); System.out.println("\n"); }

Saída no console
[color=red]2008-09-22 00:00:00.0[/color]

Como eu recupero [color=blue]a hora[/color] e a data no formato dd/MM/yyyy ?
Eu continuo pesquisando,mas se puder dar mais algumas dicas, fica mais grato ainda,
abs.

m0ska

Então, neste caso, ao invez de utilizar java.sql.Date c vai utilizar java.sql.TimeStamp :smiley: é a mesma coisa c pode conveter de um pra o outro ou vice versa.

Ah sim, ao invez de usar jdbc, pra maioria das aplicações, salvo as peculiares, eu remomendo o uso de HIBERNATE.

Sucesso!

W

Então, conforme mencionei anteriormente, já tentei o timeStamp

Já tentei usar o seguinte:
preparedStatement.setTimestamp(5,harServerLibMud.getDataInclusao()); mas não é aceito pelo eclipse.
[color=red]The method setTimestamp(int, Timestamp) in the type PreparedStatement is not applicable for the arguments (int, Date)[/color]

E não sei o motivo de dar erro quando tento usar TimeStamp

Quanto ao hibernate, eu já pensei em utilizá-lo, mas tenho restrições aqui no trabalho.
Vlw. Continuno tentando.

m0ska
//Essa aqui é a data do objeto.
Date data = new Date();

//Agora jogo a data num calendar pra poder manipula-la
Calendar calendar = new GregorianCalendar();
calendar.setTime(data);
		
//Depois utilizo o construtor de java.sql. Timestamp que pegar o número de milisegundos desde 1970
//usando o método getTimeInMillis() da classe Calendar. :)
Timestamp time = new Timestamp(calendar.getTimeInMillis());

com isso seu problema deve estar resolvido :smiley:

W

m0ska, acho que estamos quase lá, gravou a data e hora na tabela, porém, veja o resultado que foi gravado:
2008-09-22 14:07:59.717

O problema é que o horário certo deveria ser 16:07 segundo o relógio do windows. Está marcando 2 horas a menos.
Alguma idéia?
abs.

m0ska

Sim, no calendar ou na data tem que se definir o seu locale… algo do tipo… bem, mas aí já é outro tópico :smiley: nunca precisei mexer com locales.

W

É, estou olhando a API e vendo como posso aplicar o locale. Mas preciso descobrir como deixar isso default, pois em outra empresa eu utilizava o código abaixo que funcionava normalmente e agora está dando erro no timeStamp quando tento fazer, conforme mencionei:

o problema é que na época eu já utilizava o que estava pronto e não sabia como estava “configurado”.

Vou continuar pesquisando, mas agradeço sua atenção que foi de grande ajuda, caso tenha mais alguma idéia pra terminar de resolver isso, pode mandar. :wink:
Obrigado.

Criado 22 de setembro de 2008
Ultima resposta 22 de set. de 2008
Respostas 8
Participantes 2