recorrer obtener nombre datos columna java jdbc metadata cachedrowset

datos - obtener nombre columna resultset java



¿Cómo verifico si existe un nombre de columna en un CachedRowSet? (5)

Estoy consultando datos de vistas que están sujetas a cambios. Necesito saber si la columna existe antes de hacer una crs.get******() . He descubierto que puedo consultar los metadatos de esta manera para ver si existe una columna antes de solicitar los datos.

ResultSetMetaData meta = crs.getMetaData(); int numCol = meta.getColumnCount(); for (int i = 1; i < numCol+1; i++) if(meta.getColumnName(i).equals("name")) return true;

¿Hay una manera más simple de verificar para ver si existe una columna?

EDITAR: debe ser independiente de la base de datos. Es por eso que estoy haciendo referencia al CachedRowSet lugar de a la base de datos.


¿Qué base de datos?

Creo que en Oracle hay tablas donde se enumeran las columnas.

No recuerdo si también funciona para vistas, pero supongo que sí, era algo así como:

select colum_name from all_views where view_name like ''myview''

o

select name from all_objects where object_name like ''myview'' and object_type=''view''

No recuerdo exactamente la sintaxis. Sin embargo, debes tener permisos espaciales.

Cada RDBMS debe tener algo similar.

También puedes realizar la consulta

select * from myView where 1 = 0 ;

Y a partir de los metadatos, obtenga las columnas, si es lo que desea, evite buscar los datos antes de saber si las columnas están presentes.


No hay una manera más simple con la API general de JDBC (al menos no que yo sepa, o pueda encontrar ... Tengo exactamente el mismo código en mi conjunto de herramientas local).

(Su código no está completo):

ResultSetMetaData meta = crs.getMetaData(); int numCol = meta.getColumnCount(); for (int i = 1; i < numCol+1; i++) { if(meta.getColumnName(i).equals("name")) {return true;} } return false;

Dicho esto, si utilizas API patentadas, específicas de la base de datos y / o consultas SQL, estoy seguro de que puedes encontrar formas más elegantes de hacer lo mismo ... pero tendrías que escribir código personalizado para cada base de datos que Necesito lidiar con Me quedaría con las API de JDBC, si fuera tú.

¿Hay algo acerca de la solución propuesta que te haga pensar que es incorrecta? Me parece lo suficientemente simple ...


No, realmente no hay una mejor manera. Es posible que desee volver a analizar el problema. Si puede redefinir el problema, a veces simplifica la solución porque el problema ha cambiado.


ADVERTENCIA: siguiendo un comentario puramente de memoria sin ningún papeleo de apoyo :)

Si mal no recuerdo, hay un problema misterioso que se vuelve cada vez más feo cuando se usa la implementación del conjunto de filas en caché oracle con la agrupación de conexiones. Parece que hay una referencia silenciosa a la conexión mantenida dentro del objeto del conjunto de filas en caché (aunque se supone que debe estar desconectado) que cierra otra conexión posteriormente abierta desde el grupo en la recolección de basura. Por esta razón, finalmente me di por vencido y escribí mi propia capa de objetos de datos (estos días me gustaría entregarlo a Spring & hibernate).


podría tomar el enfoque más breve de usar el hecho de que findColumn () arrojará una SQLException para InvalidColumName si la columna no está en CachedRowSet.

por ejemplo

try { int foundColIndex = results.findColumn("nameOfColumn"); } catch { // do whatever else makes sense }

Probablemente sea un abuso de Exception Handling (por EffectiveJava 2nd ed elemento 57), pero es una alternativa a recorrer todas las columnas de los metadatos.