【问题标题】:SQL response is treated as column name, rather than content in JavaSQL 响应被视为列名,而不是 Java 中的内容
【发布时间】:2017-03-26 00:06:34
【问题描述】:

以下方法从 SQL 数据库获取结果集并填充 Map<String,String>。它在大多数情况下都能正常工作,但是对于这个特定的查询,我得到一个例外:

无法执行查询:select RULEID, GRAPHRULE from GRAPHRULE3D WHERE GRAPHRULE LIKE '%1717-002%' AND GRAPHRULE NOT LIKE '%DRAWING%' 引起:com.microsoft.sqlserver.jdbc.SQLServerException:列名('1717-002');无效。

查询本身适用于 SQL Server。为什么它认为第二列中的('1717-002'); 是列名,而实际上是一个值?


问题出现在String value = rs.getString(rs.getString(2).trim());,如果我放弃它,我会得到一组String key =Integer.toString((Integer) rs.getObject(1));,没有问题。

//String query = "select RULEID, GRAPHRULE from GRAPHRULE3D WHERE GRAPHRULE LIKE '%1717-002%' AND GRAPHRULE NOT LIKE '%DRAWING%'"
public Map<String,String> getStrinfStringPairsFromIntegerStringSQL(String query) {

    return processContent(query, (rs) -> {
        Map<String,String> optionDescriptions = new TreeMap<>();

        while (rs.next()) {

            String key =Integer.toString((Integer) rs.getObject(1));
            String value = rs.getString(rs.getString(2).trim());

            optionDescriptions.put(key, value);
        }
        return optionDescriptions;
    });
}


@FunctionalInterface
public static interface ResultSetHandler<S, T> {

    Map<S, T> accept(ResultSet rs) throws SQLException;
}

public <S, T> Map<S, T> processContent(String query, ResultSetHandler handler) {
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        try (Connection con = DriverManager.getConnection(connectionUrl)) {
            try (Statement stmt = con.createStatement()) {
                try (ResultSet resultSet = stmt.executeQuery(query)) {
                    return handler.accept(resultSet);
                }
            }
        }
    } catch (SQLException e) {
        throw new IllegalStateException("Unable to execute query: " + query, e);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(EngineSQLUtils.class.getName()).log(Level.SEVERE, null, ex);
    }

    return null;
}

【问题讨论】:

  • 等等...您正在从结果集中获取一个值并将其用作同一结果集中的列名?这不可能工作...如果您的结果集有1717-002 作为值,则该行rs.getString(rs.getString(2).trim()); 将扩展为rs.getString("1717-002");。你肯定不是那个意思吧?你有两列RULEID, GRAPHRULE...
  • 我正在使用String value = rs.getString(rs.getString(2).trim()); - 试图在第二列中获取一个字符串(比如它有foo)。相反,Java 认为我正在尝试搜索名称为 foo 的列。
  • 哦,知道了。我的复制粘贴错误。谢谢。请给它一个答案,这样我就可以结束这个问题了。
  • Java 是对的...ResultSet.getString( string columnName ) 方法将查找传递给它的 columnName 的值。您正在为列GRAPHRULE 传递一个值,即1717-002,并使用它来查找列1717-002 的值。您的结果集中没有列 1717-002

标签: java sql sql-server exception


【解决方案1】:

您正在从结果集中获取一个值,并将其用作同一结果集中的列名。这不适用于您的查询。

如果您的结果集有 1717-002 作为值,则该行 rs.getString(rs.getString(2).trim()); 将扩展为 rs.getString("1717-002");。你肯定不是那个意思吧?您只有 RULEIDGRAPHRULE 列。

【讨论】:

    【解决方案2】:

    RULE 是 SQL-server 中的保留字,所以你的查询是错误的。
    如果可以,我建议更改列名,这只是问题的根源。
    如果不能,请尝试WHERE RULESET.RULE LIKE '%1717-002%'WHERE [RULE] LIKE '%1717-002%'

    【讨论】:

    • 对不起,我编的名字。实际上是RULEID, GRAPHRULE from GRAPHRULE3D ...。此外,它适用于 SQL Server 应用程序。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2023-03-13
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多