Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 02, 2008, 02:00:41
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Empieza una nueva comunidad de programación: Oneble ... es lo que tu quieras que sea

+  Foros Java y C/Linux
|-+  Programación
| |-+  Java J2SE
| | |-+  jTable, MySQL y tipos de datos date
« anterior próximo »
Páginas: [1] Enviar tema Imprimir
Autor Tema: jTable, MySQL y tipos de datos date  (Leído 151 veces)
HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email


« en: Agosto 16, 2008, 06:04:33 »

Hola gente, llevo varios día con este problemas y no encontre ninguna solucion en internet asi q me animé a escribir aqui para ver si alguno de ustedes puede ayudarme.
El problema que tengo es el siguiente:
Cuando intento recuperar un tipo de dato date de un resultset proveniente de una base datos en mysql y quiero mostrarlo en un jTable, me aparece una excepcion y no se termina de pintar el jTable. Solo sucede cuando intento recuperar un tipo de dato date o time, con los otros tipos de datos anda joya.
El modelo de tabla que uso es:
Código:
public class ResultSetTableModel extends AbstractTableModel{
    public Connection conexion;
    private ResultSetMetaData metaData;
    private ResultSet resultSet;
    private int numberOfRows;
   
    public ResultSetTableModel(Connection c,String ConsultaInicial)throws SQLException, ClassNotFoundException{
        conexion=c;
        setConsulta(ConsultaInicial);
    }
    // el constructor esta sobrecargado para que tambien pueda recibir como
    // parametro el ResultSet y de este modo puedo hacer consultas con parametros
    // variables
    // Principalmente lo usé para el Pre-Creation code de la tabla turnos.
    // También tuve que sobrecargar el setConsulta, el cual se encuentra mas adelante.
    public ResultSetTableModel(Connection c,ResultSet rs)throws SQLException, ClassNotFoundException{
        conexion=c;
        setConsulta(rs);
    }
    public Class getColumnClass( int column ) throws IllegalStateException
    {
      try {
         //determino el nombre de la clase de la columna especificada
         String className = metaData.getColumnClassName( column + 1 );
         // devuelvo un objeto de la clase que representa el classname
         return Class.forName( className );
      }
     
      // catch SQLExceptions and ClassNotFoundExceptions
      catch ( Exception exception ) {
         exception.printStackTrace();
      }
     
      // si ocurre un problema arriba, entonces devuelvo un objeto Object
      return Object.class;
    }
   
    public int getColumnCount() throws IllegalStateException
    {   
      // determino el número de columnas
      try {
         return metaData.getColumnCount();
      }
     
      // catch SQLExceptions and print error message
      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
     
      // si ocurre un problema arriba entonce devuelvo 0 como numero de columnas
      return 0;
    }
   
    public String getColumnName( int column ) throws IllegalStateException
    {   
      // determino el nombre de la columna
      try {
         return metaData.getColumnName( column + 1 ); 
      }
     
      // catch SQLExceptions and print error message
      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
     
      // si ocurre algun problema arriba entonce devuelvo una cadena vacia
      return "";
    }
   
    public int getRowCount() throws IllegalStateException
    {     
      //esta variable contiene el numero de filas y es modificada cuando se realiza la consulta
      return numberOfRows;
    }

    public Object getValueAt( int row, int column ) throws IllegalStateException
    {
      // obtain a value at specified ResultSet row and column
      try {
         // posiciona el cursor del objeto resultSet en la columna especificada
         resultSet.absolute( row + 1 );
         // obtiene un objeto object de la columna especificada, en la fila actual
         return resultSet.getObject( column + 1 );
      }
     
      // catch SQLExceptions and print error message
      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
     
      // Si ocurre un problema arriba, devuelve una cadena vacia
      return "";
    }
   
    public void setConsulta( String consulta ) throws SQLException, IllegalStateException
   {
      // ejecuto la consulta y obtengo el resultSet correspondiente
     
      //ejecuto el Store procedure correspondiente
        resultSet = conexion.createStatement().executeQuery(consulta);

      // obtengo el metadato del resultSet
      metaData = resultSet.getMetaData();

      // determino el numero de filas del resultSet
      resultSet.last();                   // me posiciono en la ultima fila
      numberOfRows = resultSet.getRow();  // obtengo el numero de fila actual(que es la ultima)     
     
      // notifica a cualquier objeto jTable que utilice como modelo a
      //ResultSetTableModel, que la estructura del modelo ha cambiado
      fireTableStructureChanged();
   }
   public void setConsulta( ResultSet resultSet ) throws SQLException, IllegalStateException
   {
      // obtengo el metadato del resultSet
      metaData = resultSet.getMetaData();

      // determino el numero de filas del resultSet
      resultSet.last();                   // me posiciono en la ultima fila
      numberOfRows = resultSet.getRow();  // obtengo el numero de fila actual(que es la ultima)     
     
      // notifica a cualquier objeto jTable que utilice como modelo a
      //ResultSetTableModel, que la estructura del modelo ha cambiado
      fireTableStructureChanged();
   }
   public void disconnectFromDatabase()
   {
      // close Statement and Connection
      try {
         conexion.close();
      }
     
      // catch SQLExceptions and print error message
      catch ( SQLException sqlException ) {
         sqlException.printStackTrace();
      }
   }

}

y la excepcion que me aparece es:
Código:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at lib.ResultSetTableModel.getValueAt(ResultSetTableModel.java:94)
        at javax.swing.JTable.getValueAt(JTable.java:2639)
        at javax.swing.JTable.prepareRenderer(JTable.java:5653)
        at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2072)
        at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1974)
        at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1770)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
        at javax.swing.JComponent.paintComponent(JComponent.java:763)
        at javax.swing.JComponent.paint(JComponent.java:1027)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JViewport.paint(JViewport.java:747)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paint(JComponent.java:1036)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
        at javax.swing.JComponent.paintChildren(JComponent.java:864)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
        at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
        at javax.swing.JComponent.paint(JComponent.java:1013)
        at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
        at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
        at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
        at java.awt.Container.paint(Container.java:1797)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
        at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
        at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Desde ya muchas gracias por leer el mensaje y espero sus prontas respuestas.

Hernán
« Última modificación: Agosto 17, 2008, 01:17:42 por HenryOS » En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #1 en: Agosto 16, 2008, 09:42:43 »

Hola:

¿Cual es exactamente esta línea de código ResultSetTableModel.java:94 ?

Se bueno.
En línea

HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email
« Respuesta #2 en: Agosto 16, 2008, 10:33:55 »

Disculpa chuidiang, se me pasó.
Esa linea se encuentra dentro del método getValueAt y es la siguiente:

Código:
resultSet.absolute( row + 1 );

Gracias por responder. Espero tu respuesta.
« Última modificación: Agosto 16, 2008, 10:36:46 por HenryOS » En línea
HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email
« Respuesta #3 en: Agosto 16, 2008, 11:34:08 »

Hola chuidiang, te comento que gracias a un amigo pude solucionar el problema de que no me pintaba el jTable con lo datos. El error estaba en que al hacer la consulta no asignaba el resultSet que obtenía, al resultSet del table model, por esta razón el resultSet era Null. La linea que tuve que agregar para solucionar el problema fue:

Código:
this.resultSet=resultSet;

y a continuación muestro la porción del código a donde pertenece:

Código:
public void setConsulta( ResultSet resultSet ) throws SQLException, IllegalStateException
   {
       
      this.resultSet=resultSet;
      // obtengo el metadato del resultSet
      metaData = resultSet.getMetaData();

      // determino el numero de filas del resultSet
      resultSet.last();                   // me posiciono en la ultima fila
      numberOfRows = resultSet.getRow();  // obtengo el numero de fila actual(que es la ultima)     
     
      // notifica a cualquier objeto jTable que utilice como modelo a
      //ResultSetTableModel, que la estructura del modelo ha cambiado
      fireTableStructureChanged();
   }

Ahora, el nuevo problema que se me planteó fue que cuando pido datos del tipo Time de una base de datos en MySQL, el jTable me muestra la  fecha, en vez del tiempo. Quería saber si puedo plantearlo aquí al problema o debo abrir un nuevo tema.
Gracias por todo y espero tu respuesta.
En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #4 en: Agosto 17, 2008, 08:39:05 »

Hola:

Si lo haces con un resultSet.getObject() el objeto devuelto debería ser java.sql.Time y la fecha de eso debería ser 1 de Enero de 1970. ¿Te está presentando esa fecha?

En cualquier caso, es raro. Si no haces nada especial, en el JTable debería mostrarse el resultado de Time.toString() que debería ser una hora.

Se bueno.
En línea

HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email
« Respuesta #5 en: Agosto 17, 2008, 07:48:08 »

Hola chuidiang, te comento que justamente me esta apareciendo lo que vos decís; osea en el campo correspondiente a la hora que quiero mostrar me aparece siempre 01-ene-1970.
Debería entonces trabajarlo al resultSet.getObject() que obtengo y de ahí extraer la hora?.O se puede de alguna manera forzar a que cuando reciba un objeto tipo Time lo pase a String con el formato correspondiente?
Saludos. Espero tu respuesta.
« Última modificación: Agosto 17, 2008, 07:56:57 por HenryOS » En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #6 en: Agosto 18, 2008, 08:29:38 »

Hola:

El método toString() de java.sql.Time escribe solo la hora. He probado con esto

Código:
Time t = new Time(11,11,12);
System.out.println(t.toString());

y la salida es

Código:
11:11:12

Si en la base de datos el campo es de tipo Time, teóricamente el resulset.getObject() debería devolverte un java.sql.Time y no debería haber problema. ¿Estás cambiando de alguna forma el TableCellRender de la tabla?

Se bueno.
En línea

HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email
« Respuesta #7 en: Agosto 18, 2008, 09:46:47 »

Hola chuidiang, me estuve fijando y en ningún momento cambié el TableCellRender. Ahora, lo que entendí de tu mensaje fue que al resultSet.getObject() le tengo que hacer un toString para el caso en que reciba un objeto del tipo java.sql.Time y con eso obtendría la hora correcta en vez de 01-ene-1970.
Si fuera así, en que parte del modelo de la tabla debería hacer el cast a String?
Por cierto gracias por mover el tema, ya que por error yo lo puse en desarrollo web.
Espero tu respuesta. Saludos.
« Última modificación: Agosto 18, 2008, 09:56:20 por HenryOS » En línea
chuidiang
Administrator
Hero Member
*****
Mensajes: 1974



Ver Perfil WWW Email
« Respuesta #8 en: Agosto 19, 2008, 09:37:10 »

Hola:

En principio no necesitas hacer un toString(). Eso lo hace el JTable cuando recibe un dato de tipo Time (o cualquier otro tipo) y lo escribe en la celda.

Haz una prueba. Donde lees el campo Time de base de datos, en el resultSet.getObject(...), haz los siguientes print

Código:
Object tiempo = resultset.getObject(....);
System.out.println (tiempo.getClass().getName());
System.out.println(tiempo.toString());

y revisa que la salida en pantalla es java.sql.Time y la hora.

Se bueno.
En línea

HenryOS
Newbie
*
Mensajes: 7

hernanperez85@gmail.com
Ver Perfil Email
« Respuesta #9 en: Agosto 19, 2008, 10:26:09 »

Hola chuidiang, te comento que ya pude solucionar el problema. Lo único que hice fue que cuando venga un objeto del tipo java.sql.Time, el getColumnClass le haga creer al jTable que la columna es del tipo java.lang.String entonces cuando el resultSet.getObjet() le hace el cast automático para pasarlo a toString ya no hay problemas para mostrarlo en el jTable.

En el código del table model agregué la siguiente condición al getColumnClass():

Código:
if (className.equals("java.sql.Time")){
      return Class.forName("java.lang.String");
}else{
      return Class.forName( className );
}

quedándome el getColumnClass() de la siguiente forma:

Código:
    public Class getColumnClass( int column ) throws IllegalStateException
    {
      try {
         //determino el nombre de la clase de la columna especificada
         String className = metaData.getColumnClassName( column + 1 );
         // devuelvo un objeto de la clase que representa el classname
         if (className.equals("java.sql.Time")){
             return Class.forName("java.lang.String");
         }else{
            return Class.forName( className );
         }
         
      }
     
      // catch SQLExceptions and ClassNotFoundExceptions
      catch ( Exception exception ) {
         exception.printStackTrace();
      }
     
      // si ocurre un problema arriba, entonces devuelvo un objeto Object
      return Object.class;
    }

La verdad no se si es la manera más óptima de hacerlo, pero es la única forma que encontré.
Muchas gracias por la ayuda. Saludos.
En línea
Páginas: [1] Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!