以下のメソッドは、SQLデータベースから結果セットを取得し、Map<String,String>
を生成します。これは、ほとんどの場合うまく動作しますが、この特定のクエリで私は例外と言っ取得:SQLレスポンスは、Javaのコンテンツではなく、カラム名として扱われます。
クエリを実行することができませんが:ます。com.microsoft.sqlserver.jdbc.SQLServerException:によって引き起こさ
select RULEID, GRAPHRULE from GRAPHRULE3D WHERE GRAPHRULE LIKE '%1717-002%' AND GRAPHRULE NOT LIKE '%DRAWING%'
列名( '1717 -002 ');有効じゃない。
クエリ自体がSQL Server上で動作します。 2列目の('1717-002');
が実際には値であるのに、なぜ列名であると思うのですか?
問題は、私はそれをドロップした場合、私は問題なくString key =Integer.toString((Integer) rs.getObject(1));
のセットを取得String value = rs.getString(rs.getString(2).trim());
に従います。
//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'の2つのカラムがあります... –
' String value = rs.getString(rs.getString(2).trim()); ' - 2番目のカラムに文字列を取得しようとしています。 'foo')。代わりにJavaは 'foo'という名前の列を検索しようとしていると考えています。 – Stepan
ああ、持っています。私のコピーペーストエラー。ありがとうございました。それを答えてください、私は質問を閉じることができますので。 – Stepan