【发布时间】: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