Ajudae_Urgente_Date

22 respostas
B

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();
   }
}

22 Respostas

Rafael_Afonso

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

Grato,

B

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

Rafael_Afonso

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,

B

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

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

cv1

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…

louds

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.

B

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

Rafael_Afonso

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,

B

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.

Daniel_Quirino_Olive

“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.

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();
//...
B

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?

Daniel_Quirino_Olive

“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?


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(…)”.

B

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


Daniel_Quirino_Olive

“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
*****************************

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

B

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.

Daniel_Quirino_Olive

“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.

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?

B

Daniel,

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

Att

Bruno

Daniel_Quirino_Olive

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

B

Também tô achando que é isso.

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

Daniel_Quirino_Olive

Troque de banco!!! :smiley:

B

Tem como eu trocar de banco e usar o mesmo arquivo *.GDB, que eu uso no InterBase.

Daniel_Quirino_Olive

Sinto muito… :frowning:

Criado 20 de novembro de 2003
Ultima resposta 21 de nov. de 2003
Respostas 22
Participantes 5