1

よし、毛がなくなった。定数文字列を executeQuery に渡す場合、問題はありません。String オブジェクトを渡すと失敗し、例外は' incorrect syntax near "."'.

すべてが本質的にまったく同じですが、何らかの理由で 1 つのケースは機能し、もう 1 つのケースは機能しません。少し背景を説明するために、SQLServer2008 DB に接続しています。何を与える?

これが私から私の髪を奪ったコードです:

public List<IdValuePair> Get_Job_Types() {
   ArrayList<IdValuePair> jt = Get_Id_Value_Pairs(
         "SELECT * FROM USER_JOB_TYPE", "JOB_TYPE_ID", "JOB_TYPE");
   return (jt);
}

private List<IdValuePair> Get_Id_Value_Pairs(String query, String idRowName,
      String valueRowName) {
   try {
      List<IdValuePair> pairs = new ArrayList<IdValuePair>();

      Class.forName("net.sourceforge.jtds.jdbc.Driver");
      m_Connection = DriverManager.getConnection(db_connect_string,
            db_userid, db_password);

      Statement stmt = m_Connection.createStatement();

      // THIS WORKS ?!
      ResultSet rs = stmt.executeQuery("SELECT * FROM USER_JOB_TYPE");

      // THIS DOESN'T !!!!???
      rs = stmt.executeQuery(query);

      // ...

      rs.close();
      stmt.close();

      return (pairs);
   }

   catch (Exception e) {
      e.printStackTrace();
      return (null);
   }
}
4

2 に答える 2

3

String オブジェクトを渡すと失敗し、例外は「不正な構文付近」です。'。

何を与える?

提示した証拠に基づいて、問題はクエリ文字列にあります。基本的に、SQLServer は、SQL クエリに構文エラーがあることを通知しています。

しかし、これは機能します:

 ResultSet rs = stmt.executeQuery("SELECT * FROM USER_JOB_TYPE");

...そのSQLクエリの構文が優れているためです。

で使用している の実際の値を出力queryします。

 rs = stmt.executeQuery(query);

解決策が明らかでない場合はquery、質問に の値を追加して、確認できるようにしてください。


質問を読み直すと文字query列は機能したものと同じでなければならないようです。しかし、例外/メッセージの証拠はそうではないことを示しており、ソースコードよりもその証拠を信じる傾向があります。

于 2012-11-27T00:19:32.900 に答える
1

私はそれを考え出した。私はマイクロソフトを非難します。何らかの理由で、SQL ステートメントを Visual Studio からコピーして InteliJ に貼り付けると、MS は非表示の BOM 文字を追加しました。つまり、BOM を送ったのは Microsoft だったようです。平凡な愚かなハイブ、マイクロソフトに感謝します。

于 2012-12-03T21:08:40.970 に答える