Erro ao inserir data (Java 11 + JDBC 4.3 + Firebird 2.5)

Java

JDBC

Firebird

06/02/2019

Olá a todos.
Estou enfrentando problemas ao tentar fazer algo parecido com o seguinte:

    private final String INSERT = "insert into tabela (datacompra) values (?);" //
    LocalDate d = LocalDate.now();
    PreparedStatement pstm = con.prepareStatement(INSERT);
    pstm.setDate(Date.valueOf(d)); // <- aqui lança a exceção
    pstm.executeUpdate();


Ao executar o setDate do PreparedStatement, é lançada a seguinte exceção:

org.firebirdsql.jdbc.field.TypeConversionException: Error converting to date.
at org.firebirdsql.jdbc.field.FBField.setDate(FBField.java:722)
at org.firebirdsql.jdbc.AbstractPreparedStatement.setDate(AbstractPreparedStatement.java:318)

Já tentei converter a data em String para usar o Date.valueOf(String s) mas, mesmo assim a exceção é lançada.
Alguém já passou por isso e conseguiu resolver via JDBC?
Raphael Peret

Raphael Peret

Curtidas 0

Respostas

Raphael Peret

Raphael Peret

06/02/2019

Olá a todos.
Estou enfrentando problemas ao tentar fazer algo parecido com o seguinte:

private final String INSERT = "insert into tabela (datacompra) values (?);" //
LocalDate d = LocalDate.now();
PreparedStatement pstm = con.prepareStatement(INSERT);
pstm.setDate(Date.valueOf(d)); // <- aqui lança a exceção
pstm.executeUpdate();


Ao executar o setDate do PreparedStatement, é lançada a seguinte exceção:

org.firebirdsql.jdbc.field.TypeConversionException: Error converting to date.
at org.firebirdsql.jdbc.field.FBField.setDate(FBField.java:722)
at org.firebirdsql.jdbc.AbstractPreparedStatement.setDate(AbstractPreparedStatement.java:318)

Já tentei converter a data em String para usar o Date.valueOf(String s) mas, mesmo assim a exceção é lançada.
Alguém já passou por isso e conseguiu resolver via JDBC?


Tentei editar mas não encontrei a opção. O exemplo de código correto é:

private final String INSERT = "insert into tabela (datacompra) values (?);" //
LocalDate d = LocalDate.now();
PreparedStatement pstm = con.prepareStatement(INSERT);
pstm.setDate(1, Date.valueOf(d)); // <- aqui lança a exceção
pstm.executeUpdate();


Havia esquecido o parâmetro do índice. A exceção é a mesma.
GOSTEI 0
Marcio Souza

Marcio Souza

06/02/2019

Sua instrução está correta. O problema deve ser com o Firebird.Tente trocar a versão do driver de conexão, talvez seja um bug na versão que está usando.
Ou então ele não trabalha com Date e sim como Timestamp. Nesse caso, teria que trocar sua data para timestamp.
pstm.setTimestamp(1, Timestamp.valueOf(d));

GOSTEI 0
Raphael Peret

Raphael Peret

06/02/2019

Sua instrução está correta. O problema deve ser com o Firebird. Tente trocar a versão do driver de conexão, talvez seja um bug na versão que está usando.
Ou então ele não trabalha com Date e sim como Timestamp. Nesse caso, teria que trocar sua data para timestamp.
pstm.setTimestamp(1, Timestamp.valueOf(d));



Obrigado pela resposta, Maurício.
Fiz o que você sugeriu. Tanto com um driver mais atual quanto com um mais antigo e, mesmo assim, o problema persiste. Também tentei converter em Timestamp e não deu certo (até porque o tipo de dado no banco realmente é um date mas, tentei a sorte).

Estava usando a versão 3.0.3 do Jaybird. Olhei no source do driver e acabei vendo que a implementação do método setDate apenas lança a exceção sem nem tentar configurar o valor passado no objeto. :-|

Se tiver alguma outra sugestão (que não envolva trocar a linguagem ou o banco), eu testo e posto o resultado. Enquanto isso, vou pesquisando outras alternativas também.
GOSTEI 0
POSTAR