Foros del Web » Programación para mayores de 30 ;) » Java »

Como saber cual es el tipo de un campo de una bd?

Estas en el tema de Como saber cual es el tipo de un campo de una bd? en el foro de Java en Foros del Web. Hola, como lo dice el título, me gustaría saber cual es tipo de un campo de una bd. Me explico, tengo este código: Cita: public ...
  #1 (permalink)  
Antiguo 16/11/2009, 07:08
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Como saber cual es el tipo de un campo de una bd?

Hola, como lo dice el título, me gustaría saber cual es tipo de un campo de una bd.

Me explico, tengo este código:

Cita:
public Vector<Columna> demeCampos() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException
{

Vector<Columna> columnas = new Vector<Columna>(0);

Connection cnx = Catalogos.demeSolitario().demeConexionMySQL();

DatabaseMetaData md = (DatabaseMetaData) cnx.getMetaData();
ResultSet rs = (ResultSet) md.getColumns(null, null, "%", "%");
while (rs.next()) {
columnas.add(new Columna(rs.getString(3), rs.getString(4)));
}

return columnas;
}
Columnas tiene el NOMBRE DEL CAMPO y EL TIPO DE CAMPO.
osea:
private String nombreCampo;
private String tipoCampo;

Entonces, en la parte donde dice rs.getStrin(3) me recupera perfectamente el NOMBRE DEL CAMPO, pero me gustaría saber el tipo del campo, pensé que se podría hacer con el rs.getString(4).

Alguien me podría ayudar? Les agradecería demasiado si me pudieran ayudar!
  #2 (permalink)  
Antiguo 16/11/2009, 07:45
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Como saber cual es el tipo de un campo de una bd?

Hmmm.. estuve averiguando y conseguí este código:

Cita:
public Vector<Columna> demeCampos() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException
{

Vector<Columna> columnas = new Vector<Columna>(0);

Connection cnx = Catalogos.demeSolitario().demeConexionMySQL();

DatabaseMetaData md = (DatabaseMetaData) cnx.getMetaData();
ResultSet rs = (ResultSet) md.getColumns(null, null, "%", null);
while (rs.next()) {
columnas.add(new Columna(rs.getString("COLUMN_NAME"), rs.getString("TYPE_NAME")));
}

return columnas;
}
Pero el problema es que me sale como string del tipo algo como "Columna@13785d3".

Ahí si no se que hacer.. :S
  #3 (permalink)  
Antiguo 16/11/2009, 08:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Como saber cual es el tipo de un campo de una bd?

Hola:

Según la API, se obtiene el tipo con rs.getInt("DATA_TYPE") que devuelve un entero cuyo valor corresponde a un tipo según las constantes definidas en java.sql.Type

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 16/11/2009, 08:47
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Como saber cual es el tipo de un campo de una bd?

Gracias por responder Chuidiang!

Lo intenté, pero no me sirvió.. :(

Tocará seguir buscando.. :S

PD: Me encanta la disposición de la gente como siempre le gusta ayudar..

Aplaudo este foro..

Saludos.
  #5 (permalink)  
Antiguo 16/11/2009, 13:07
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Como saber cual es el tipo de un campo de una bd?

Cita:
Iniciado por chuidiang Ver Mensaje
... Según la API[/URL], se obtiene el tipo con rs.getInt("DATA_TYPE") que devuelve un entero cuyo valor corresponde a un tipo según las constantes definidas en java.sql.Type ...
Cita:
Iniciado por vashzero Ver Mensaje
Lo intenté, pero no me sirvió.. :(
¿Entonces que quieres hacer realmente?
Posiblemente te sea de alguna ayuda,

Código Java:
Ver original
  1. public void showTableStructure() {
  2.         try {
  3.             DatabaseMetaData m = DBConnection.getMetaData();
  4.             ResultSet r = m.getColumns(null, null, "jos_content", null);
  5.             while (r.next()) {
  6.                 System.out.printf("Nombre : %s. Tipo : %s\n",
  7.                         r.getString(4), translateType(r.getInt("DATA_TYPE")));
  8.             }
  9.         } catch (SQLException ex) {
  10.             ex.printStackTrace();
  11.         }
  12.     }
  13.  
  14.     private String translateType(int i) {
  15.         switch (i) {
  16.             case java.sql.Types.VARCHAR:
  17.                 return "VARCHAR";
  18.             case java.sql.Types.INTEGER:
  19.                 return "INTEGER";
  20.             // ... LOS DEMAS TIPOS
  21.             default:
  22.                 return "TIPO DESCONOCIDO";
  23.         }
  24.     }

Saludos,
  #6 (permalink)  
Antiguo 16/11/2009, 15:08
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Como saber cual es el tipo de un campo de una bd?

Mmm.. no.. , lo intenté pero siguen saliendo cosas como:

Cita:
Columna@32784a
y no se que pasa, lo implementé de la siguiente manera:


Cita:
public Vector<Columna> demeCampos() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException
{

Vector<Columna> columnas = new Vector<Columna>(0);

Connection cnx = Catalogos.demeSolitario().demeConexionMySQL();

ResultSet rs = null;
DatabaseMetaData md = (DatabaseMetaData) cnx.getMetaData();
rs = (ResultSet) md.getColumns(null, null, "%", null);
while (rs.next()) {
columnas.add(new Columna(rs.getString("COLUMN_NAME"), translateType(rs.getInt("DATA_TYPE")), rs.getInt("COLUMN_SIZE"), rs.getInt("NULLABLE")));
}

return columnas;
}

private String translateType(int i) {
switch (i) {
case java.sql.Types.VARCHAR:
return "VARCHAR";

case java.sql.Types.INTEGER:
return "INTEGER"; // ... LOS DEMAS TIPOS
default:
return "TIPO DESCONOCIDO";
}
}
Gracias por tu esfuerzo, pero alguien mas sabe que podría pasar?
  #7 (permalink)  
Antiguo 16/11/2009, 17:30
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Como saber cual es el tipo de un campo de una bd?

Hola,

Lo que sucede es que no estas especificando la forma en que lo despliegas. Usando mi imaginación voy a suponer que estas usando un JComboBox o algo parecido.

Si fuera un JComboBox entonces la clase Columna debería de redefinir un método que le diga en que forma desplegarse, puesto que el método toString de la clase Object muestra el nombre de la clase y la dirección en memoria (del JVM) donde está ubicada (Columna@32784a),

Código:
    public class Columna {
        protected String Nombre;
        protected String Tipo;
        public Columna(String Nombre, String Tipo) {
            this.Nombre = Nombre;
            this.Tipo = Tipo;
        }
// getters / setters .. etc
        @Override
        public String toString() {
            return this.Nombre + " " + this.Tipo;
        }
    }
Si fuera otro tipo de contenedor como JTable, (que sería la forma preferida para mostrar datos tabulados), entonces el método demeCampos está mal diseñado puesto que regresa un Vector de Columnas, y debería devolver un Vector de Vectores de String.

Si es otro contenedor, entonces lo hubieras especificado desde el principio, el código que mostre anteriormente solamente lo despliega en la pantalla como una lista, pero no se que componentes estas usando.

Saludos,
  #8 (permalink)  
Antiguo 16/11/2009, 17:40
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Como saber cual es el tipo de un campo de una bd?

Hola,

Otra forma para no estar redefiniendo el método toString podría ser que en el lugar de insertar Columnas en la lista, insertes Strings directamente, puesto que String.toString debe regresar el mismo String.

Código:
while (rs.next()) {
columnas.add(
new String(
  rs.getString("COLUMN_NAME") + 
  translateType(rs.getInt("DATA_TYPE"))));
}
...
El new String es opcional, no es necesario.
Y la clase Genérica Vector<Columna> columnas ... debería usar tipos String <String>.

Saludos,

Última edición por HackmanC; 16/11/2009 a las 17:44 Razón: columnas
  #9 (permalink)  
Antiguo 16/11/2009, 18:31
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Como saber cual es el tipo de un campo de una bd?

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

Otra forma para no estar redefiniendo el método toString podría ser que en el lugar de insertar Columnas en la lista, insertes Strings directamente, puesto que String.toString debe regresar el mismo String.

Código:
while (rs.next()) {
columnas.add(
new String(
  rs.getString("COLUMN_NAME") + 
  translateType(rs.getInt("DATA_TYPE"))));
}
...
El new String es opcional, no es necesario.
Y la clase Genérica Vector<Columna> columnas ... debería usar tipos String <String>.

Saludos,
Este ejemplo es muy parecido al primero que me diste no?

En realidad yo utilizo el columnas, ya que columnas es una clase que tiene tanto String para guardar el nombre de la columna, el tipo de columna, el tamaño de la columna y la propiedad si es nullable o no.

Entonces pues ahí la idea sería guardar todos esos valores, pero el problema es que solo me guarda bien el primer valor (osea el nombre de la columna).

Intentando con el translate type, no me sirvió, pero depronto estoy haciendo algo mal..

Con respecto que si es un combobox, no lo es, de hecho solo lo muestro como tal (JOptionPane.showMessageDialog(null, columna.nombre);

Hmmm.. agradezco todo el esfuerzo que están haciendo para ayudarme..
  #10 (permalink)  
Antiguo 16/11/2009, 19:55
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Como saber cual es el tipo de un campo de una bd?

Cita:
Iniciado por vashzero Ver Mensaje
Este ejemplo es muy parecido al primero que me diste no? ...
Tecnicamente es lo mismo.

Cita:
Iniciado por vashzero Ver Mensaje
... En realidad yo utilizo el columnas, ya que columnas es una clase que tiene tanto String para guardar el nombre de la columna, el tipo de columna, el tamaño de la columna y la propiedad si es nullable o no. ...
Exactamente ese es el punto. Tu clase es un POJO, DTO, y posiblemente un Bean, no lo puedo saber exactamente porque no lo has mostrado. Pero ese es el punto cuando escribí toString. Por ejemplo,

Código:
class Columna {
  private String a;
  private String b;
  public Columna(String a, String b) {
    this.a = a;
    this.b = b;
  }
}

Columna col = new Columna('A', 'B');
JOptionPane.showMessageDialog(null, col);
En ese caso va a escribir en pantalla algo como 'package.Columna@384792'.
Pero si le agregas el método @overload toString(),

Código:
class Columna {
  private String a;
  private String b;
  public Columna(String a, String b) {
    this.a = a;
    this.b = b;
  }
  public String toString() {
    return this.a + " : " + this.b;
  }
}

Columna col = new Columna('A', 'B');
JOptionPane.showMessageDialog(null, col);
Entonces te va a mostrar 'nombre : INTEGER'.
Y si estas haciendo esto:

Código:
JOptionPane.showMessageDialog(null, columna.nombre);
Estas especificando claramente que solo muestre el nombre.

Cita:
Iniciado por vashzero Ver Mensaje
... Intentando con el translate type, no me sirvió, pero depronto estoy haciendo algo mal.. ..
Posiblemente, pero bueno, espero que puedas resolverlo, posiblemente alguien con mayor experiencia te pueda ayudar a resolver eso,

Saludos,
  #11 (permalink)  
Antiguo 17/11/2009, 06:45
 
Fecha de Ingreso: marzo-2007
Mensajes: 25
Antigüedad: 17 años, 1 mes
Puntos: 0
Respuesta: Como saber cual es el tipo de un campo de una bd?

Hackman, agradezco todo tu interés y esfuerzo por ayudarme...

Y a todos los que me colaboraron en este for..

Gracias!!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:18.