Como el ResultSet contiene los datos devueltos desde el SQL dinámico, si hay algún método para determinar si el ResultSet contiene un nombre de columna en particular? Por ejemplo, si ejecuto rs.getString("Column_ABC");
pero Column_ABC realmente no existe, arrojará la excepción. ¿Cómo puedo probar si el ResultSet puede obtener datos de una columna llamada "Column_ABC"?¿Cómo puedo determinar si el nombre de la columna existe en el ResultSet?
Respuesta
Utilice la clase ResultSetMetaData
.
public static boolean hasColumn(ResultSet rs, String columnName) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int columns = rsmd.getColumnCount();
for (int x = 1; x <= columns; x++) {
if (columnName.equals(rsmd.getColumnName(x))) {
return true;
}
}
return false;
}
Lo que no entiendo es por eso que nunca sería necesaria esta función. La consulta o el procedimiento almacenado que se está ejecutando debe tener resultados conocidos. Las columnas de la consulta deben ser conocidas. Necesitar una función como esta puede ser una señal de que hay un problema de diseño en alguna parte.
Al ejecutar consultas de usuario en herramientas como TOAD, la aplicación no conoce la estructura de consulta y debe usar 'ResultSetMetaData'. Pero sí, buscar un nombre de columna en particular es extraño. – gpeche
Solo comentando ... en su ejemplo, está recuperando toda la información de la columna. Para una consulta de usuario, espero que esto sea estándar. Esto todavía no está buscando para ver si se incluye una columna específica. –
Esto es básicamente correcto, pero 'getColumnName' toma su parámetro a partir de 1 no 0. Necesitas' for (int x = 1; x <= columns; x ++) ' –
si no rs.getString ("Column_ABC") = nada, entonces 'aquí código
Esta es una mala idea, y también está mal. Cuando una columna no existe, no devuelve nada. Lanza una SQLException, que debes atrapar y manejar. Nunca debe usar una excepción lanzada para una verificación simple como esta. Siempre debe buscar un método que realmente devuelva un valor booleano, algo que realmente realizará una verificación adecuada. –
No estoy seguro de si esto es más o menos eficiente que la respuesta de Erick, pero es más fácil.
String str;
try {
str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
str = null;
}
Es, sin duda, más fácil de entender. Sin embargo, y sin importar el hecho de que no veo el controlador JDBC devolviendo las excepciones "SQLServer", los métodos ResultSet devuelven SQLException si el nombre de la columna no es válido o si se produce un error de SQL más genérico (lo que dificulta el trabajo de saber qué sucedió: si el nombre de la columna es incorrecto o si se produjo un error real) + info @ [ResultSet Javadoc] (http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-java.lang .String-) –
-1 Las excepciones deben usarse solo en circunstancias excepcionales, y luego deben registrarse. Tomar la salida más fácil tiende a crear código que es difícil de entender y mantener. Si está utilizando un conjunto de resultados del lado del servidor y perdió la conexión a la base de datos antes de realizar esta llamada, este método emitirá una excepción incluso si la columna existe. Este tipo de escenario puede generar consecuencias desastrosas si el código usa esta verificación (por ejemplo) para determinar si toda la base de datos necesita inicialización. –
Gracias João tienes razón. Quise decir SQLException. Intenté elegir uno genérico. – Zip184
/**
* returns default value if column is not present in resultset
*
* @param rs
* @param columnLabel
* @param defaultValue
* @return
*/
@SuppressWarnings("unchecked")
private static <T> T getValueFromResultSet(final ResultSet rs,
String columnLabel, T defaultValue) {
try {
return (T) rs.getObject(columnLabel);
} catch (SQLException e) {
return defaultValue;
}
}
En la versión Java> = 7 tiene una opción de tipo Class paso en el método ResultSet # getObject
Esta debería ser la respuesta correcta. Esta es una forma segura de proporcionar un tipo de objeto get desde una fila, para llenar/mapear un objeto independientemente de si debe llenarse o no, el cliente o la lógica de negocio subyacente debe saber qué esperar y verificar su seguridad con los datos . – thekevshow
No estoy de acuerdo, Erick Robertson explica por qué en los comentarios de la respuesta anterior. –
Mientras esto funciona, se abusa de la idea detrás del manejo de excepciones. – Benedictus
- 1. Java ResultSet - get Nombre de columna basado en el índice
- 2. Compruebe el valor si existe en la columna
- 3. ¿Cómo puedo determinar si existe un subdirectorio en C#?
- 4. Compruebe si DataRow existe por nombre de columna en C#?
- 5. ¿Cómo puedo determinar si existe una función Perl en el tiempo de ejecución?
- 6. ¿Verifica si existe una columna de lista con el modelo de objetos de cliente de SharePoint?
- 7. ¿Cómo puedo determinar el nombre del directorio actual en R?
- 8. ¿Cómo comprobar si el nombre de la cuenta de usuario de Windows existe en el dominio?
- 9. ¿Cómo puedo verificar si existe un nombre de usuario dado?
- 10. ¿Cómo puedo verificar si la columna de la tabla mysql existe?
- 11. ¿Cómo puedo determinar si una columna es una columna de identidad en MSSQL 2000?
- 12. Obtener el tipo de datos de una columna ResultSet
- 13. No se puede determinar si existe una cola con el nombre de formato especificado.
- 14. Base de datos de búsqueda si el nombre de columna/nombre de campo existe en una tabla en mySQL
- 15. ¿Cómo puedo determinar si existe un hash git dado en una rama determinada?
- 16. determinar si existe $ _SESSION superglobal en PHP
- 17. Cómo verificar si existe una columna con un nombre de pila en un datarow
- 18. ¿Cómo puedo verificar si el archivo existe en Makefile?
- 19. ¿Cómo puedo determinar si una columna está en la clave principal de su tabla? (SQL Server)
- 20. Buscar si el valor en la columna A contiene el valor de la columna B?
- 21. Probar si existe el nombre de color CSS
- 22. ¿Cómo verifico si existe un nombre de columna en un CachedRowSet?
- 23. El nombre de columna no es válido. [Nombre del nodo (si lo hay) = t0, Nombre de la columna = versión]
- 24. registro de inserción si no existe en SQL, duplicar nombre de la columna
- 25. MySQL - Cambiar el nombre de la columna
- 26. ¿Cómo puedo obtener el nombre de columna de la clave principal de una tabla de base de datos del objeto ResultSet o ResultSetMetaData en JAVA?
- 27. ¿Cómo puedo validar si la columna existe en un objeto DataRow?
- 28. Cómo localizar el nombre de columna DataTable
- 29. Obtener el nombre de la columna en jpa
- 30. ¿Determinar el nombre de dominio en JavaScript?
posible duplicado de [Cómo puedo comprobar para ver si existe un nombre de columna en una CachedRowSet ?] (http://stackoverflow.com/questions/462534/how-do-i-check-to-see-if-a-column-name-exists-in-a-cachedrowset) – bluish