0

LOCIDに基づいていくつかの行を選択したいと思います。ただし、where句を記述できず、文字列と整数を示す互換性のないオペランドタイプを示すコンパイルエラーが発生します。

String selectQuery = "SELECT  * FROM " + TABLE_LOCATIONAPPS + " WHERE " 
    + KEY_LOCID == id;

これが作成クエリです。

String query1 = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
            + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
            +  ")";

LOCIDタイプはintです。理由は何でしょうか。

4

3 に答える 3

4

文字列を正しく作成していません。文字列の一部として同等の比較を行う必要があります。

String selectQuery = "SELECT  * FROM " + TABLE_LOCATIONAPPS + " WHERE " 
    + KEY_LOCID + " = " + id;

これは、SQL文字列を手動で作成することが優れたアイデアではない理由の一例にすぎません。これらのタイプのエラーに加えて、SQLインジェクションの問題が発生する可能性があります。これは、入力が適切にサニタイズされておらず、SQLコマンドが意図しないことを実行してしまう場合です。

于 2012-08-09T01:53:30.927 に答える
1

連結された文字列に基づいてフィルタリングを実行しないことをお勧めします。これにより、SQL インジェクション攻撃が可能になります。(これがどのように機能するかの例をいくつか示します。)

より安全な解決策は次のとおりです。

String selectQuery = "SELECT * FROM " + TABLE_LOCATIONAPPS + " WHERE KEY_LOCID = ?"
PreparedStatement pstmt = connection.prepareStatement(selectQuery);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();

(これは、準備済みステートメントの再利用によるパフォーマンス向上の扉も開きます。)

于 2012-08-09T02:04:19.903 に答える
0

クエリで実際に比較を行っていないように見えます。Javaを使用してKEY_LOCIDとIDを比較しています。

試す:String selectQuery = "SELECT * FROM " + TABLE_LOCATIONAPPS + " WHERE KEY_LOCID == " + id;

于 2012-08-09T01:54:39.520 に答える