Java + SQL e parseamento de datas

Como está o campo na tabela do banco de dados?
Como date? Datetime?

drsmachado

Dá o seguinte erro na linha:

p.setDate(3, new java.sql.Date(dataFinal.getTime()));

cannot instantiate Date(long) at java.sql.Date to ()

Datetime, retornando 2010-02-01 09:07:28:367

neste formato!

Sim, datetime é este formato.
Tentou da forma que eu postei antes?

Não entendi. :frowning:

Você não insere formatado, a idéia de formatar é justamente para exibição, você não vai exibir seus dados no banco, ou vai ? :shock:

O banco apenas “guarda” a informação que foi no dia tal, as tal horas/minutos/segundos/etc o formato que as informações estão no banco não devem interferir em nada, até porque diferentes bancos formatam datas/dados de diferentes maneiras e quanto menos você (você = sua aplicação) se importa em como os dados estão representados no banco, mais flexível sua aplicação fica (só pra constar, flexibilidade é bom ).

Na hora que você for exibir a data que ela deve ser formatada :smiley:

[]'s

Bom Dia Thiago, não sei até que ponto é viavel você utilizar a classe calendar para fazer isso…

Eu acredito que seja mais interessante… Bom fica a minha sugestão…

Abraço

Bom…

Se você tem um date por exemplo no banco e insere no banco um GETDATE() ele não aceita.
O formato retornado pelo GETDATE() é diferente.

No java retorna Tue Feb 01 09:12:33 GMT -03:00 2011

Se você tentar no banco:

insert into tblRegistro (dataFinal) values (Tue Feb 01 09:12:33 GMT -03:00 2011)
ou até mesmo …values (“Tue Feb 01 09:12:33 GMT -03:00 2011”)

Ele te retorna um erro de incompatibilidade de formatos.
Tendo tudo isso em vista, este é o motivo para o qual eu preciso da data SAINDO corretamente no Banco, para não precisar ficar criando triggers no Banco para inserir a data correta, entendeu?
Se eu mandar isso do Java para o Banco ele da erro no banco e não insere nada.

[quote=drigo.angelo]Não entendi. :frowning:

Você não insere formatado, a idéia de formatar é justamente para exibição, você não vai exibir seus dados no banco, ou vai ? :shock:

O banco apenas “guarda” a informação que foi no dia tal, as tal horas/minutos/segundos/etc o formato que as informações estão no banco não devem interferir em nada, até porque diferentes bancos formatam datas/dados de diferentes maneiras e quanto menos você (você = sua aplicação) se importa em como os dados estão representados no banco, mais flexível sua aplicação fica (só pra constar, flexibilidade é bom ).

Na hora que você for exibir a data que ela deve ser formatada :smiley:

[]'s[/quote]

Desculpe drigo.angelo, mas a data a ser inserida é informada pelo usuário ou o sistema pega a data atual.
Bem, sendo assim, como você “guarda” a data atual? Passando direto um new Date()?
Ou você força o usuário a digitar a data no formato ISO, apenas para não convertê-la?
O usuário vai informar a data no formato que ele reconhece como tal (no caso do Brasil, dd/MM/yyyy), não?
Se eu informar isso ao banco de dados, qualquer que seja ele, ele vai entender como erro (a não ser que estejamos passando para uma procedure que esteja apta a converter, aí é outro esquema… Aliás, poderíamos até passar símbolos quânticos que não haveria problemas).

Código bonitiho, sim, nos padrões, ótimo.
Mas o nosso amigo não consegue inserir o dado.
Se é string ou não, se é uma árvore binária ou rubro negra, tanto faz, resolve o problema?

Vamos fazer assim, diferente!!!

Como executo procedure pelo Java?

Criei a Procedure que faz isso, já tenho os parâmetros, como executo ela?
Ficou assim o código…mas não é asssim, creio eu!

public void InsereResultado() {


        String coman_proc = "exec AtualizaDataFinal (?,?,?)";
        PreparedStatement p;



        try {

            p = this.cx.fazConexao().prepareStatement(coman_proc);
            p.setString(1, form.getResultado());
            p.setString(2, "2");
            p.setInt(3, form.getProtocolo());

            p.execute();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Então acho que eu entendi o problema errado, como eu disse :frowning:

Pra inserir uma data no banco, utilize o método set(int, java.sql.Date) do preparedStatement

Se você sabe o formato que o usuário digitou, pode converter a String pra um objeto do tipo java.util.Date utilizando o método parse do SimpleDateFormat, igual você fez acima

Se for sempre pegar a data atual (sempre no sentido de todas as vezes que passar em um trecho específico do código) é melhor criar um new java.util.Date, que pega a data atual do sistema

Isso funciona e é “bonitinho” dentro dos padrões, só pensei que ele queria que no banco de dados os dados ficassem representados de uma maneira específica e queria ajustar isso na aplicação, tipo “quero que no banco de dados, as datas fiquem no formato ‘DD/MM/YYYY-HH:MM:SS.MMMM’, daí eu crio um campo do tipo varchar(24) e formato a data na aplicação toda vez que for inserir uma data, insiro como uma String” isso eu acho errado

Desculpe o transtorno, foi pq eu entendi errado…

[]'s

Pra executar a procedure depende do SGBD, no caso do postgress você teria que mudar o coman_proc = “exec AtualizaDataFinal (?,?,?)”; pra coman_proc = “SELECT AtualizaDataFinal (?,?,?)”;

Você já está usando preparedStatement, então, a chamada, caso seja o banco de dados MySQL é

String coman_proc = "CALL AtualizaDataFinal (?,?,?)";

Cada BD vai ter um diferente…

SQL Server.

Eu coloquei de uma forma que encontrei aqui, mas não deu não!! =x
Tá dificil, hein…

Acho que pra fazer o software todo não apanhei tanto, quanto esta data!!

[quote=Thiago0803]pmlm, valeu cara…
Mas olha o que deu!!

Cannot find symbol.
method parse(java.util.Date)
location: class java.text.SimpleDateFormat

Da esse erro.

O código ficou assim, após eu mudar apenas algumas coisinhas para se adequar ao meu necessário:

[code]
public void InsereResultado() {

    String comando = "Update tblRegistro Set Resultado = ?, Situacao = ?, dataFinal = ? Where ProtocoloID = ?";

PreparedStatement p;

String formato = “yyyy-MM-dd HH:mm:ss.SSS”; // Formato no FORM
SimpleDateFormat formatter = new SimpleDateFormat(formato);
Date dataFinal = formatter.parse(form.getDataFinal());

try {

        p = this.cx.fazConexao().prepareStatement(comando);
        p.setString(1, form.getResultado());
        p.setString(2, "2");
        p.setDate(3, new java.sql.Date(dataFinal.getTime()));
        p.setInt(4, form.getProtocolo());

        p.execute();

 } catch (SQLException e) {
       e.printStackTrace();
 }

}
[/code][/quote]

form.getDataFinal() já é um date? Nesse caso, podes tirar as três linhas antes do try e mudar só a linha do setDate para:

p.setDate(3, new java.sql.Date(form.getDataFinal().getTime()));

Código ficou:


public void InsereResultado() {


        //String coman_proc = "exec AtualizaDataFinal (?,?,?)";




        String coman_proc = "CALL AtualizaDataFinal (?,?,?)";
        PreparedStatement p;



        try {

            p = this.cx.fazConexao().prepareStatement(coman_proc);
            p.setString(1, form.getResultado());
            p.setString(2, "2");
            p.setInt(3, form.getProtocolo());

            p.execute();

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

Deu os seguinte erros:
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near ‘@P0’.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:156)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1373)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:371)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:322)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4003)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1550)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:160)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:133)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:304)

Desculpa cara, acabei esquecendo.

Você vai precisar do CallableStatement e não do preparedStatement.

Aqui tem um exemplo

http://www.java2s.com/Code/Java/Database-SQL-JDBC/CallStoredProcedureInMySql.htm

Eu uso

cs.registerOutParameter(1, java.sql.Types.INTEGER);

ou não?
Utilizo SQL Server e isso é de MySQL, não sei se é mesma sintaxe, é?

Aí vai um exemplo para SQLServer
http://www.javadb.com/connect-to-database-and-call-stored-procedure
E aqui:
http://onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html?page=1
http://onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html?page=2

Esquece!!

Não consigo, não está indo de jeito nenhum!!
Já tinha visto este site e tentei.

…valeu pela ajuda, mas depois de 1 semana tentando eu desisto!

uahuahau…

Depois de uma semana, desistir?
Se a questão é só formato da data, bem, joga como String mesmo e acabou.

Desistir desta etapa do programa :slight_smile:

Vou fazer alguns outros ajustes que precisam ser feitos ainda e mais pra frente eu vejo este problema da data!!

=D