Pegar a data atual para gravar no banco (Firebird)

11 respostas
A

Já pesquisei em diversos fóruns mas ainda não consegui resolver o meu problema.

Como faço prá pegar a data atual do sistema e gravar em uma tabela no banco Firebird?

Eu estou fazendo assim:

Calendar rightnow = new Calendar();
data_cadastro = rightnow.getTime();

Onde “data_cadastro” é a variável que está sendo utilizada para efetuar o INSERT.

Só que ele a data que ele retorna com o “getTime” é “por extenso”, e eu preciso no formato DD/MM/YYYY.

Como faço prá resolver isto?

Existe algum tópico que já fala como resolver isto?

11 Respostas

J

A data não é por extenso, porque data em Java não tem formato, é apenas um numero long, use um PreparedStatement:

PreparedStatement stmt = conexao.prepareStatement("insert into tabela(data) values(?)");

Date data = new Date();

stmt.setDate(1, new java.sql.Date(data.getTime());
A

Entendi.

Porém agora estou com outro problema.

Na classe que instancia a classe que vai criar o registro na tabela está assim:

java.sql.Date dtAtual = new java.sql.Date();
          Usuarios novoUsu = new Usuarios();
          novoUsu.cd_usuario       = "admsis";
          novoUsu.nm_usuario       = "Administrador do Sistema (Padrão)";
          novoUsu.dt_cadastro      = dtAtual;

E na classe USUARIOS eu estou fazendo assim:

stInsert = "INSERT INTO usuario (" +
                                       "cd_usuario, " +
                                       "nm_usuario " +
                                       ") " +
                                       "VALUES (" + 
                                       "'" + this.cd_usuario + "', " +
                                       "'" + this.nm_usuario + "', " +
                                       "? " +   // dt_cadastro
                                       ")";
      
      try {

         PreparedStatement SqlStmt = conn.prepareStatement(stInsert); 

         SqlStmt.setDate(1, this.dt_cadastro);

      } catch (SQLException e) {
        e.printStackTrace();
        System.out.println(stInsert);
      }

Só que na primeira linha da classe principal está ocorrendo o erro:

Documents\Particular\Projetos Java\BomGourmet\build\classes

C:\Documents and Settings\log36198\My Documents\Particular\Projetos Java\BomGourmet\src\bomgourmet\InicializaSistema.java:615: cannot find symbol

symbol  : constructor Date()

location: class java.sql.Date

java.sql.Date dtAtual = new java.sql.Date();

Se eu troco o java.sql.Date por java.util.Date ele dá erro na linha em que estou atualizando o campo DT_CADASTRO com a data atual:


Documents\Particular\Projetos Java\BomGourmet\build\classes
C:\Documents and Settings\log36198\My Documents\Particular\Projetos Java\BomGourmet\src\bomgourmet\InicializaSistema.java:621: incompatible types
found : java.util.Date
required: java.sql.Date
novoUsu.dt_cadastro = dtAtual;

Se vou na classe USUARIOS e altero a definição do campo para java.util.Date daí não consigo aplicar o comando SqlStmt.setDate(1, this.dt_cadastro);.

Como resolvo?

J

1º - Use java.util.Date pra representar datas em seus objetos.
2º - A classe java.sql.Date não tem esse construtor vazio.
3º - Troque o atributo da sua classe Usuarios de java.sql.Date pra java.util.Date.
4º - Evite usar essas concatenações com PreparedStatement, ele é justamente pra evitar isso:

stInsert = "INSERT INTO usuario (cd_usuario, nm_usuario, dt_cadastro) VALUES (?, ?, ?)";

try {
   PreparedStatement SqlStmt = conn.prepareStatement(stInsert);

   SqlStmt.setString(1, usuario.cd_usuario);
   SqlStmt.setString(2, usuario.nm_usuario);
   SqlStmt.setDate(3, new java.sql.Date(usuario.dt_cadastro.getTime()));
   SqlStmt.executeUpdate();
} catch (SQLException e) {
   e.printStackTrace();
   System.out.println(stInsert);
}

5º - Siga as convenções de nomeclatura, veja em http://jairelton.com
6º - Use encapsulamento, não deixe seus atributos como public, crie metodos get e set pra eles.
7º - Não deixe codigo de acesso a dados dentros desse beans.

Acho que é só isso por enquanto! :wink:

A

Valeu!

Grato pelas dicas!

BrunoBastosPJ

usando firebird não tem a função NOW()? Em mysql tem… talvez fosse mais fácil ^^

A

Jairelton, só mais uma pergunta:

O que você quis dizer com “Não deixe codigo de acesso a dados dentros desse beans.”?

J

Os objetos que representam os dados, como uma classe Usuario, Cliente, Produto, etc, só devem representar os dados, contendo apenas atributos e metodos get e set, nada de acesso a dados nele, pra fazer acesso a dados procure de Pattern DAO, no meu site tem algumas aplicações de exemplo que talvez ajudem!

ex.:

public class Usuario{
  private int id;
  private String nome;
  private String login;
  //get & set

   //esse metodo não deveria estar aqui
  public void inserir(){
       PreparedStatement stmt = conexao.prepareStatement("insert into usuarios values(null, ?, ?)";

       stmt.setString(1, this.getNome());
       stmt.setString(2, this.getLogin());
       stmt.executeUpdate();
  }
}
A

Certo, vou procurar no seu site para saber a respeito.

Só mais uma coisa:

Eu fui fazer um teste da forma que você passou, usano PreparedStatement, só que está dando um erro como se o número de argumentos ou o tipo deles não fosse correto:

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error

SQL error code = -804

SQLDA missing or incorrect version, or incorrect number/type of variables

at org.firebirdsql.jdbc.AbstractStatement.executeUpdate(AbstractStatement.java:201)

at bomgourmet.Usuarios.incluiUsuario(Usuarios.java:354)

at bomgourmet.InicializaSistema.VerificaDadosBase(InicializaSistema.java:628)

at bomgourmet.InicializaSistema.Inicializa(InicializaSistema.java:77)

at bomgourmet.BomGourmet.main(BomGourmet.java:64)

at org.firebirdsql.gds.GDSException: Dynamic SQL Error

SQL error code = -804

SQLDA missing or incorrect version, or incorrect number/type of variables

at org.firebirdsql.jgds.GDS_Impl.readStatusVector(GDS_Impl.java:1758)

at org.firebirdsql.jgds.GDS_Impl.receiveResponse(GDS_Impl.java:1711)

at org.firebirdsql.jgds.GDS_Impl.isc_dsql_execute2(GDS_Impl.java:910)

at org.firebirdsql.jca.FBManagedConnection.executeStatement(FBManagedConnection.java:766)

at org.firebirdsql.jdbc.AbstractConnection.executeStatement(AbstractConnection.java:922)

INSERT INTO usuario (cd_usuario,  nm_usuario,  nm_usuario_red,  dt_cadastro,  id_administrador,  senha,  dt_ult_atu_senha,  cd_usuario_atu,  dt_ultima_atu) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)

at org.firebirdsql.jdbc.AbstractStatement.internalExecute(AbstractStatement.java:1015)

at org.firebirdsql.jdbc.AbstractStatement.executeUpdate(AbstractStatement.java:196)

at bomgourmet.Usuarios.incluiUsuario(Usuarios.java:354)

at bomgourmet.InicializaSistema.VerificaDadosBase(InicializaSistema.java:628)

at bomgourmet.InicializaSistema.Inicializa(InicializaSistema.java:77)

at bomgourmet.BomGourmet.main(BomGourmet.java:64)

Já conferí os campos e os tipos, e a principio está tudo correto …

O código é esse:

stInsert = "INSERT INTO usuario (cd_usuario, " + 
                                     " nm_usuario, " + 
                                     " nm_usuario_red, " +
                                     " dt_cadastro, " +
                                     " id_administrador, " +
                                     " senha, " +
                                     " dt_ult_atu_senha, " +
                                     " cd_usuario_atu, " +
                                     " dt_ultima_atu)" +
                                     " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ";
      
      try {

         PreparedStatement stmtSql = InicializaSistema.conn.prepareStatement(stInsert); 

         stmtSql.setString(1, this.cdUsuario);
         stmtSql.setString(2, this.nmUsuario);
         stmtSql.setString(3, this.nmUsuarioRed);
         stmtSql.setDate(4, new java.sql.Date(this.dtCadastro.getTime()));
         stmtSql.setString(5, this.idAdministrador);
         stmtSql.setString(6, this.txSenha);
         stmtSql.setDate(7, new java.sql.Date(this.dtUltAtuSenha.getTime()));
         stmtSql.setString(8, this.cdUsuarioAtu);
         stmtSql.setDate(9, new java.sql.Date(this.dtUltimaAtu.getTime()));

         vlResult = stmtSql.executeUpdate(stInsert);
J

Errado:

Correto:

vlResult = stmtSql.executeUpdate();
A

Blz! Agora funcionou!

Onde acho o texto sobre “Pattern DAO” no seu site?

J

Não tem um texto lá, ainda vou fazer um video mas estou enrolando… :oops:

Tem exemplos, como a loja virtual e o exemplo de DWR, mas se quiser um texto, veja:

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Criado 31 de julho de 2006
Ultima resposta 31 de jul. de 2006
Respostas 11
Participantes 3