2016-11-11 3 views
0

以下のメソッドは、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; 
} 
+0

お待ちください...あなたは結果セットから価値を得て、同じ結果セットの列名として使用していますか?それはおそらく動作することはできません...あなたの結果セットが値として '1717-002'を持っている場合、その行' rs.getString(rs.getString(2).trim()); 'は' rs.getString( "1717-002"); '。確かにあなたはそれのようなものを意味していませんでしたか? 'RULEID、GRAPHRULE'の2つのカラムがあります... –

+0

' String value = rs.getString(rs.getString(2).trim()); ' - 2番目のカラムに文字列を取得しようとしています。 'foo')。代わりにJavaは 'foo'という名前の列を検索しようとしていると考えています。 – Stepan

+0

ああ、持っています。私のコピーペーストエラー。ありがとうございました。それを答えてください、私は質問を閉じることができますので。 – Stepan

答えて

3

しようとすると、同じ結果セットの列名として使用できない場合。それはあなたが持っているクエリではうまくいかないでしょう。

結果セットの値が1717-002の場合、その行rs.getString(rs.getString(2).trim());rs.getString("1717-002");に拡張されます。確かにあなたはそれのようなものを意味していませんでしたか?列にはRULEIDGRAPHRULEしかありません。

1

RULEは、SQLサーバーの予約語なので、クエリが間違っています。
可能であれば、問題の原因となる列名を変更することをお勧めします。
あなたは、あなたが結果セットから値を取っているWHERE RULESET.RULE LIKE '%1717-002%'またはWHERE [RULE] LIKE '%1717-002%'

+0

申し訳ありませんが、私は名前を作りました。それは実際に 'RULEID、GRAPHRULE from GRAPHRULE3D ...'でした。また、それはSQLサーバーアプリケーションで動作します。 – Stepan

関連する問題