ResultSet
包含从动态 SQL 返回的数据,如果有任何方法可以确定 ResultSet
是否包含特定列名?
例如,如果我运行 rs.getString("Column_ABC")
,但实际上并不存在 "Column_ABC"
,将会抛出异常。
如何测试是否可以从名为 "Column_ABC"
的列中获取 ResultSet
数据?
使用 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;
}
我不理解为什么需要这个函数。执行的查询或存储过程应该已知结果,查询的列也应该已知。需要这样一个函数可能是设计上存在问题的迹象。
private boolean isThere(ResultSet rs, String column){
try{
rs.findColumn(column);
return true;
} catch (SQLException sqlex){
logger.debug("column doesn't exist {}", column);
}
return false;
}
我不确定这个方法是比埃里克的答案更高效还是更低效,但它更加简单易懂。
String str;
try {
str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
str = null;
}
resultSet.getColumnMetaData().contains(columnName)
ResultSet
接口没有 getColumnMetaData
方法。 - IdontCareAboutReputationPoints/**
* 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;
}
}
如果 rs.getString("Column_ABC") 不等于空,则 ' 在此编写您的代码
getColumnName
方法的参数从1开始而不是0。你需要使用for (int x = 1; x <= columns; x++)
。 - Adrian SmithAS
子句定义的列名,可以使用ResultSetMetaData.getColumnLabel
。请注意不改变原意但确保内容通俗易懂。 - SantoshequalsIgnoreCase
方法来检查名称是否相同。在我的情况下,查询中有一个小写的列名,但是通过getColumnName()
函数返回的是大写字母形式。 - Luca RegazziJOIN
返回一个列,而另一个存储过程不返回该列。为了提高性能,只进行需要的连接操作可能是好的,而不是选择不必要的列并使用默认值来匹配你的应用程序可能使用的理论模式。通过像rs.containsColumn(x)
这样的方法,一个方法可以读取任何一个存储过程的结果,而不是第二种方法与第一种方法完全相同,但却少了一个rs.get***()
方法。明白吗? - s.co.tt