Bienvenido(a),
Visitante
. Favor de
ingresar
o
registrarse
.
Septiembre 07, 2010, 07:18:44
Noticias:
Más tutoriales de java
Foros Java y C/Linux
Programación
Java J2SE
jTable, MySQL y tipos de datos date
« anterior
próximo »
Páginas:
[
1
]
Autor
Tema: jTable, MySQL y tipos de datos date (Leído 1024 veces)
HenryOS
Newbie
Karma: 0
Mensajes: 10
jTable, MySQL y tipos de datos date
«
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
Karma: 2
Mensajes: 3389
Re: jTable, MySQL y tipos de datos date
«
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
http://www.chuidiang.com
http://blog.chuidiang.com
HenryOS
Newbie
Karma: 0
Mensajes: 10
Re: jTable, MySQL y tipos de datos date
«
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
Karma: 0
Mensajes: 10
Re: jTable, MySQL y tipos de datos date
«
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
Karma: 2
Mensajes: 3389
Re: jTable, MySQL y tipos de datos date
«
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
http://www.chuidiang.com
http://blog.chuidiang.com
HenryOS
Newbie
Karma: 0
Mensajes: 10
Re: jTable, MySQL y tipos de datos date
«
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
Karma: 2
Mensajes: 3389
Re: jTable, MySQL y tipos de datos date
«
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
http://www.chuidiang.com
http://blog.chuidiang.com
HenryOS
Newbie
Karma: 0
Mensajes: 10
Re: jTable, MySQL y tipos de datos date
«
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
Karma: 2
Mensajes: 3389
Re: jTable, MySQL y tipos de datos date
«
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
http://www.chuidiang.com
http://blog.chuidiang.com
HenryOS
Newbie
Karma: 0
Mensajes: 10
Re: jTable, MySQL y tipos de datos date
«
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
]
« anterior
próximo »
Ir a:
Por favor selecciona un destino:
-----------------------------
Programación
-----------------------------
=> C/C++ linux
=> Visual C#
=> Java J2SE
===> Temas de interés cerrados.
=> Java: Librerías
=> Java J2ME
=> Visual Basic
=> Pyhton
=> Perl
-----------------------------
Programación Web
-----------------------------
=> Javascript
=> ActionScript
=> CSS
=> PHP
=> Java J2EE y JSP
-----------------------------
Herramientas y librerías
-----------------------------
=> IDEs
=> Maven y Ant
=> Control de Versiones
=> Bases de Datos
=> Herramientas de Gestión de Proyectos
-----------------------------
Metodologías de Gestión de Proyectos
-----------------------------
=> Metodologías Agiles
=> Metodologías tradicionales
-----------------------------
Sistemas Operativos
-----------------------------
=> Linux
=> Windows
-----------------------------
Varios
-----------------------------
=> Ofertas de empleo
=> ¿Un cafecito?
=> Varios
1 Hora
1 Día
1 Semana
1 Mes
Siempre
Ingresar con nombre de usuario, contraseña y duración de la sesión
Powered by SMF 1.1.11
|
SMF © 2006-2007, Simple Machines LLC
Loading...