2017-01-01 6 views
1

私は本当にのjava/sqliteのを使用して、説明することはできません、問題に会った:コードのこの作品は私に間違った順序(デフォルトの順序)を与えるSqliteを+ジャワ、プリペアドステートメントを持つ奇妙な行動

String sql = "Select date, type FROM line ORDER BY ?"; 
    PreparedStatement st = DB.getConnexion().prepareStatement(sql); 
    st.setString(1, sort); 
    ResultSet rs = st.executeQuery(); 

[と私を信頼して、パラメータが良好であることを確認して再確認してください]

String sql = "Select date, type FROM line ORDER BY " + sort; 
    PreparedStatement st = DB.getConnexion().prepareStatement(sql); 
    //st.setString(1, sort); 
    ResultSet rs = st.executeQuery(); 

これは期待される結果をもたらします。私はここで紛失しちょうど、これは私には意味がありません。 私はeeclipseを再起動し、プロジェクトを再構築し、sqliteブラウザから直接リクエストをテストし、すべての可能な場所でパラメータと結果をチェックしましたが、sqliteのsetString()関数が自分のパラメータに適切な属性を付けていないようですクラッシュやエラーが発生することさえあります。

私は本当に愚かなものを紛失しているか、ここで非常に間違っていることがあります。

+2

[Preparedステートメントと変数バインドを使用してJavaでJDBCドライバを使用する](http://stackoverflow.com/questions/12430208/using-a-prepared-statement-and-variable-bind-order) -by-in-java-with-jdbc-driver) – GurV

答えて

3

実際には、この構文がSQLエンジンによって受け入れられることは驚きです。おそらく他のいくつかでは失敗する可能性があります。

とにかく、sortは文字列定数として解釈されるため、すべての行のソートアルゴリズムの値は同じになります。したがって、同じ値を持つので、元の順序を維持します。

このような動的ステートメントを使用することはできません。唯一の方法は、ソート文字列にソートを直接追加する2番目の方法です。

+0

私は非常に頑固なので、私はデータを扱っていなかったことに気付かず、私のための顔面とあなたに感謝します。私はそれが墜落して、私を馬鹿と呼んでいたと思う。 – fen

1

これは、パラメータが文字列であることをSQLに伝えているためです。パラメータが名前であるとします。あなたの文は次のようなものになるだろう:これは技術的には、有効なSQLかもしれません

Select date, type FROM line ORDER BY 'Name' 

、それが有効に列を注文するつもりはない - それは、それは文字通り「名前」により発注者名欄での注文はありませんが、これは常に同じ定数文字列です。

私はこのためのパラメータを使用することはできないと思います。ステートメント自体を変更して、必要なソート列を持つ必要があります。もちろん、これを行うときに注射の脆弱性が認められないようにしたいので、おそらく変数にあるものをステートメントに固執したくないでしょう。テーブルに可能な列を含むホワイトリストを作成し、それらの列ではないものを拒否したい場合があります。

+0

おかげさまで – fen