2009-01-20 15 views
9

Estoy consultando datos de vistas que están sujetas a cambios. Necesito saber si la columna existe antes de hacer un crs.get******(). He encontrado que puedo consultar los metadatos de esta manera para ver si existe una columna antes de solicitar los datos.¿Cómo verifico si existe un nombre de columna en un CachedRowSet?

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 alguna forma más sencilla de verificar si existe una columna?

EDIT: Debe ser la base de datos agnóstico. Es por eso que me refiero al CachedRowSet en lugar de a la base de datos.

Respuesta

8

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

(el código no es completa):

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 se utiliza y consultas de propiedad, de la API de base de datos específica/o SQL, estoy seguro de que puede encontrar maneras más elegantes de hacer la misma cosa. ..pero tendrías que escribir un código personalizado para cada base de datos con la que necesites lidiar. Me quedaría con las API de JDBC, si fuera tú.

¿Hay algo acerca de su propuesta de solución que te hace pensar que es incorrecto? Parece bastante simple para mí ...

+0

Soy nuevo en cachedRowSet, me di cuenta de esto cuando escribía mi pregunta. Hacer la pregunta de forma coherente me hizo pensar en términos diferentes. Solo asegurándome de estar en el camino correcto. – WolfmanDragon

+0

Si necesita buscar muchas columnas, siempre puede hacer que esto devuelva un 'Conjunto ' poblado por las llamadas al método 'getColumnName (i)'. De esta forma, puedes consultar 'set.contains (myCol)' en lugar de iterar sobre todo. – corsiKa

1

qué base de datos?

creo en Oracle hay mesas donde se enumeran las columnas.

No recuerdo si funciona para puntos de vista también, pero supongo que lo hacen, que 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 puede realizar la consulta

select * from myView where 1 = 0 ; 

Y a partir de los metadatos obtienen las columnas, si lo que quiere es evitar ir a buscar los datos antes de saber si las columnas están presentes.

+0

Tiene que ser una base de datos independiente. Nunca he trabajado con Oracle, pero podría estarlo haciendo muy pronto. +1 para obtener buena información sobre las vistas de Oracle. – WolfmanDragon

+0

Luego seleccione * de myview donde 1 = 0 debería hacer. Trabajando con RsMd, pero es bastante rápido. – OscarRyz

1

No, en realidad 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.

0

ADVERTENCIA: siguiente comentario sólo a partir de la memoria sin ningún documento de apoyo :)

Si no recuerdo mal hay un problema misterioso que asoma su siempre tan fea cabeza cuando el conjunto de filas aplicación Oracle en caché se utiliza con la conexión agrupando. 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 la primavera & Hibernate).

7

podría tomar el enfoque más corto de utilizar 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 
} 

Probable un abuso de manejo de excepciones (por EffectiveJava segundo elemento ed 57), pero es una alternativa al bucle a través de todas las columnas de los metadatos.

+0

Esto no parece una buena idea. – Khatri

Cuestiones relacionadas