Ajudae_Urgente_Date

Olá,
Sou novo no grupo e também em programação java.

Preciso terminar um trabalho, só que estou me matando (literalmente) para usar um campo Date de uma tabela e até agora nada.
A questão é a seguinte:
Estou montando um site em Java e preciso fazer um SELECT e repassar o resultado deste, para uma página web. Qndo os campos da tabela que são passados pelo SELECT são do tipo “Integer, Char, VarChar” funciona blz, mas quando o campo é do tipo “Date” ih, aí dá erro. Uso um Banco Interbase.

Se alguém puder me ajudar agradeço.

Att

Bruno

O código que estou usando é:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class Conpedidodata extends HttpServlet {
   private Connection c = null;
   private StringBuffer buf = null;
   public void init( ServletConfig config )
      throws ServletException
   {
      String url ="jdbc:interbase:///c:/bruno/banco.gdb";      
      super.init( config );
      try {
         Class.forName( "interbase.interclient.Driver" );
         c = DriverManager.getConnection(url,"SYSDBA","masterkey");
      }
      catch ( Exception e ) {
         e.printStackTrace();
         c = null;
      }
   }
   
   public void doPost ( HttpServletRequest request, 
                       HttpServletResponse response )
      throws ServletException, IOException
   {
      String pedido;
      
      pedido = request.getParameter( "pedido" );
      try {
         String query = "SELECT P.DTEMISSAO " +
                        "FROM CLIENTE C, UF U, REPRESENTANTE R, " +
                             "PEDIDO P, STPEDIDO SP " +
                        "WHERE C.CDUF = U.CDUF AND " + 
                              "P.CDSTPEDIDO = SP.CDSTPEDIDO AND " +
                              "P.CDCLIENTE = C.CDCLIENTE AND " +
                              "C.CDREPRESENTANTE = R.CDREPRESENTANTE AND " +  
                              "P.CDREPRESENTANTE = R.CDREPRESENTANTE AND " +
                              "P.CDPEDIDO = '" + pedido + "'";
         Statement st = c.createStatement();
         ResultSet rs = st.executeQuery( query );
         ResultSetMetaData rsmd = rs.getMetaData();
         buf = new StringBuffer();
         
         buf.append( "<HTML><BODY>
" );
         buf.append("<table border= 1 cellspacing=1>");         
         while ( rs.next() ) { 
            buf.append("<tr>");
            buf.append("<td>" + rs.getDate( 1 ) + "</td>");
            buf.append("</tr>");
         }         
         buf.append("</table>");
         buf.append( "</BODY></HTML>
" );
         st.close();                   
      }              
      catch ( SQLException sqlex ) {
         System.err.println ( "Problemas no Login " );
         sqlex.printStackTrace();
      } 
      
      PrintWriter output;
      response.setContentType( "text/html" ); //tipo de conteúdo
      output = response.getWriter();
      output.println( buf.toString() );
      output.close();
   }
}

Que tipo de erro? SQLException? Mostre-nos o stack trace.

Grato,

Caro Rafael,

O erro é o seguinte:

500 Servlet Exception
java.lang.NullPointerException
at Conpedidodata.doPost(Conpedidodata.java:101)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:165)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:103)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:105)
at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:190)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:165)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:221)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:253)
at com.caucho.server.port.WorkerThread.run(WorkerThread.java:129)
at java.lang.Thread.run(Thread.java:536)

Att

Bruno

Mostre-nos o que acontece na linha 101.
Mas seja o que for, você está tentando executar um método de um objeto que ainda não foi inicializado,portanto é null. Daí a exceção.

Grato,

A linha 101 é: output.println( buf.toString() );

mas já inicializei o objeto StringBuffer na linha 8: private StringBuffer buf = null;

Tem um bug bastante sutil aqui: pela especificacao, Servlets nao podem possuir variaveis de instancia, ja que uma mesma instancia pode processar diversos requests em paralelo. Por essas e outras, o comportamento deste servlet nao eh nada confiavel…

A especificação diz isso, mesmo?

Pq até onde eu sei vc pode usar variaveis de instancia desde que tenha 2 coisas em mente:

-seu servlet vai ser acessado por mais de uma thread.
-o número de instancias que serão criadas é indeterminado.

E aí? o que faço então.

Bruno,

Acho que você pode fazer duas ou três coisas:
1: Faça um log de seu método: Antes de cada linha que for mexer em buf faça algo como:

System.out.ptintln("Antes de "buf = new StringBuffer(); ": " + buf);
...
System.out.ptintln("Antes de "buf.append("<table border= 1 cellspacing=1>"); ": " + buf);
...
System.out.ptintln("Antes de "output.println( buf.toString() );": " + buf);
...

Pode até ser algo bem canhestro, mas deve te dar alguma idéia.
2.1: Você poderia alocar (nossa, é termo de C++!! :shock: ) o StringBuffer já na declaração:

private StringBuffer buf = new StringBuffer(); 

Para evitar os problemas levantados pelo cv, sempre esvazie o buffer no início do método doPost():

buf.setLenght(0);

2.2: Já que aparentemente você está usando buf apenas dentro de doPost(), faça dele uma variável deste método ao invés de ser um atributo da classe.

Espero que isso ajude,

Rafael,

Declarei a variável buf dentro do “doPost()”.
Aquele erro que dava por causa da linha 101, lembra? Pois é, parou de dar este erro, mas a resposta foi uma página totalmente em branco. Acho que ele ainda sim está passando “null” como resposta.

[quote=“brsna”]Rafael,

Declarei a variável buf dentro do “doPost()”.
Aquele erro que dava por causa da linha 101, lembra? Pois é, parou de dar este erro, mas a resposta foi uma página totalmente em branco. Acho que ele ainda sim está passando “null” como resposta.[/quote]

Não, você não declarou a variável buf dentro do método doPost. Você a inicializou lá dentro. O que provavelmente está acontecendo no seu servlet é que o processamento está jogando um SQLException e você não sabe disso. Altere o código da seguinte forma:

//...
      String pedido;
      StringBuffer buf = new StringBuffer(); 
      pedido = request.getParameter( "pedido" );
      try {
         String query = "SELECT P.DTEMISSAO " +
                        "FROM CLIENTE C, UF U, REPRESENTANTE R, " +
                             "PEDIDO P, STPEDIDO SP " +
                        "WHERE C.CDUF = U.CDUF AND " +
                              "P.CDSTPEDIDO = SP.CDSTPEDIDO AND " +
                              "P.CDCLIENTE = C.CDCLIENTE AND " +
                              "C.CDREPRESENTANTE = R.CDREPRESENTANTE AND " + 
                              "P.CDREPRESENTANTE = R.CDREPRESENTANTE AND " +
                              "P.CDPEDIDO = '" + pedido + "'";
         Statement st = c.createStatement();
         ResultSet rs = st.executeQuery( query );
         ResultSetMetaData rsmd = rs.getMetaData();         
         buf.append( "<HTML><BODY>
" );
         buf.append("<table border= 1 cellspacing=1>");         
         while ( rs.next() ) {
            buf.append("<tr>");
            buf.append("<td>" + rs.getDate( 1 ) + "</td>");
            buf.append("</tr>");
         }         
         buf.append("</table>");
         buf.append( "</BODY></HTML>");
" );
         st.close();                   
      }             
      catch ( SQLException sqlex ) {
         System.err.println ( "Problemas no Login " );
         buf.append( "<HTML><BODY>");
         buf.append("<p><h1>Problemas no login</h1></p>");
         buf.append("<p><h3>"+sqlex+"</h3></p>");
         buf.append( "</BODY></HTML>");
         sqlex.printStackTrace();
      }
     
      PrintWriter output;
      response.setContentType( "text/html" ); //tipo de conteúdo
      output = response.getWriter();
      output.println( buf.toString() );
      output.close();
//...

Daniel,

Fiz as alterações que vc falou, e deu o seguinte erro:

Problemas no login

interbase.interclient.SQLException: [interclient][interbase] Dynamic SQL Error SQL error code = -206 Column unknown DTEMISSAO Client SQL dialect 1 does not support reference to DATE datatype.

O que isso quer dizer?

[quote=“brsna”]Daniel,

Fiz as alterações que vc falou, e deu o seguinte erro:

Problemas no login

interbase.interclient.SQLException: [interclient][interbase] Dynamic SQL Error SQL error code = -206 Column unknown DTEMISSAO Client SQL dialect 1 does not support reference to DATE datatype.

O que isso quer dizer?[/quote]
Quer dizer que você não pode fazer um “ResultSet.getDate(…)” para o valor da coluna DTEMISSAO. Um chute: tente pegar o dado com “ResultSet.getString(…)”.

Usei o “ResultSet.getString()”, mas o erro continuou o mesmo de quando usava “ResultSet.getDate()”.

Ou seja


Problemas no login

interbase.interclient.SQLException: [interclient][interbase] Dynamic SQL Error SQL error code = -206 Column unknown DTEMISSAO Client SQL dialect 1 does not support reference to DATE datatype


[quote=“brsna”]Usei o “ResultSet.getString()”, mas o erro continuou o mesmo de quando usava “ResultSet.getDate()”.

Ou seja


Problemas no login

interbase.interclient.SQLException: [interclient][interbase] Dynamic SQL Error SQL error code = -206 Column unknown DTEMISSAO Client SQL dialect 1 does not support reference to DATE datatype
*****************************[/quote]

Opa… peraí, existe tal coluna no banco de dados?

Caro Daniel,

O problema é extamente esse kra, toda vez que eu tento usar na minha query Sql um campo da tabela que seja do tipo “Date” dá esse erro.

[quote=“brsna”]Caro Daniel,

O problema é extamente esse kra, toda vez que eu tento usar na minha query Sql um campo da tabela que seja do tipo “Date” dá esse erro.[/quote]

Caro brsna,

não me chame de “caro” :wink: . Pode chamar de Daniel direto :smiley: .
Bom, você já tentou executar esta mesma query no console do Interbase (IBConsole) para saber se ela está de fato correta? E a coluna DTEMISSAO de fato existe na tabela PEDIDO?

Daniel,

No console do InterBase a query funciona blz, já fiz isso, quanto a coluna DTEMISSAO existe com certeza.

Att

Bruno

Chute: talvez o interclient não suporte colunas do tipo DATE

Também tô achando que é isso.

E aí se for isso, vc tem alguma idéia do que devo fazer.