如何确定ResultSet中是否存在列名?

Ken*_*han 63 java jdbc resultset

由于ResultSet包含从动态SQL返回的数据,是否有任何方法可以确定ResultSet是否包含特定的列名?例如,如果我运行rs.getString("Column_ABC");但Column_ABC确实不存在,它将抛出异常.如何测试ResultSet是否可以从名为"Column_ABC"的列中获取数据?

Eri*_*son 96

使用该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;
}
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么需要这个功能.正在执行的查询或存储过程应具有已知结果.应该知道查询的列.需要这样的功能可能表明某处存在设计问题.

  • 搜索列名没什么奇怪的.在高度动态,用户可配置的系统中,列集可能会因用户选择而有很大差异.是的,可以确定该集合,但假设它始终是硬编码的,因此已知是不正确的. (20认同)
  • 这基本上是正确的但是`getColumnName`的参数从1开始而不是0.你需要`for(int x = 1; x <= columns; x ++)` (10认同)
  • 如果您有兴趣获取SQL查询的`AS`子句定义的名称,可以使用`ResultSetMetaData.getColumnLabel`. (5认同)
  • 是的,**DB** 模式应该是众所周知的。**但是**,您可能会遇到这样一种情况:一个存储过程从“JOIN”返回一列,而另一个存储过程不返回该列。仅执行所需的联接,而不是选择具有默认值的不必要的列来匹配您的应用程序可能使用的理论模式,这可能对性能有好处。通过使用像“rs.containsColumn(x)”这样的东西,一种方法可以读取任一存储过程的结果,而不是使用少一个“rs.get***()”的第二种方法,否则与第一种方法相同。不? (3认同)
  • 我建议使用“ equalsIgnoreCase”来检查名称是否相同。就我而言,我在查询中有一个小写的列名,它是从`getColumnName()`函数以大写形式返回的。 (2认同)
  • 我遇到的用例是我必须对 2 个不同的查询使用相同的“RowMapper”。并且这两个查询在结果集中只有一列差异。 (2认同)

小智 14

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @mjuarez,在这种情况下,“findColumn”命令返回并不重要。正确地被忽视。这个 isThere 方法肯定不会总是返回 true。如果未找到该列,“findColumn”将抛出 SQLException。这个答案似乎没问题。 (8认同)

Zip*_*184 6

不确定这是否比Erick的答案更有效或更低效,但它更容易.

String str;

try {
    str = rs.getString(columnName);
} catch (java.sql.SQLException e) {
    str = null;
}
Run Code Online (Sandbox Code Playgroud)

  • -1仅在特殊情况下才应使用例外,然后应记录它们.采取简单的方法往往会创建难以理解和维护的代码.如果在进行此调用之前使用服务器端结果集并且丢失了与数据库的连接,则即使该列存在,此方法也将引发异常.如果代码使用此检查(例如)来确定整个数据库是否需要初始化,则此类方案可能会导致灾难性后果. (36认同)