1

準備されたステートメントを含むこのコードがあります。クエリが冗長であることはわかっています。パラメータidは文字列<space>413530(" 413530") です。先行する空白文字に注意してください。

String query = "SELECT RSCode as id FROM Customer WHERE RSCode=?";

PreparedStatement newPrepStatement = connection
        .prepareStatement(query);
newPrepStatement.setString(1, id);
resultSet1 = newPrepStatement.executeQuery();

while (resultSet1.next()) {
    System.out.println("Got a result set.");
    logindata.add(resultSet1.getString("id"));
}

このクエリを実行しても結果が得られません。

ここで、同じステートメントを使用して、次のようにパラメーターを文字列の一部として追加するとします。

String query = "SELECT RSCode as id FROM Customer WHERE RSCode=" + id;

PreparedStatement newPrepStatement = connection
        .prepareStatement(query);
resultSet1 = newPrepStatement.executeQuery();

while (resultSet1.next()) {
    System.out.println("Got a result set.");
    logindata.add(resultSet1.getString("id"));
}

この準備済みステートメントを実行した後の結果が得られます。同じものでも動作しますjava.sql.statement

ドライバーがコードの 2 番目の部分で空白を無視する理由を知りたいのですが、最初の部分に問題があります。

4

2 に答える 2

4

パラメータを使用setStringすると、このSQLが生成される文字列としてバインドされます(バインドされたパラメータはSQL文字列と見なされます)。

SELECT RSCode as id FROM Customer WHERE RSCode=' 0123';

連結を使用する場合、使用されるSQLは次のようになります(SQL構文の一部としてスペースが無視されるため、連結された値を整数と見なします)。

SELECT RSCode as id FROM Customer WHERE RSCode=<space>0123;

この場合、それをintまたはlongまたはそれが何であれ、それを適切なタイプにバインドすることをお勧めします。setInt()またはでsetLong()

また、フィールドが文字列の場合は、最初に次のように正規化できます。

String normalizedValue = String.trim(value);
newPrepStatement.setString(1, normalizedValue);

または、次のようなSQLで直接実行することもできます。

SELECT RSCode as id FROM Customer WHERE RSCode=TRIM(?);
于 2012-07-23T13:25:22.360 に答える
1

シナリオ 1 では、クエリは次のようになります。

「RSCode を id FROM Customer WHERE RSCode=' 413530' として選択」

シナリオ 2 では、クエリは次のようになります。

「RSCode を id FROM Customer WHERE RSCode= 413530 として選択」

于 2012-07-23T13:32:12.450 に答える