8

私はそれが間違ったことをしていると感じる次のコードに出くわしました:

(これはJDK 1.4.2であるため、リストは入力されないことに注意してください)

StringBuffer queryBuffer = new StringBuffer();
ArrayList temp = new ArrayList();

... 
queryBuffer.append("and sb.POSTCODE = ? ");
temp.add(postcode);
...

conn = ConnectionManager.getConnection();       
pstmt = conn.prepareStatement(queryBuffer.toString());

これは私が心配していることです:

for(int i=0; i<temp.size(); i++) {
    log.debug("setString("+ (i+1) + "," + (String)temp.get(i) + ")");
    pstmt.setString(i+1, (String)temp.get(i));
}

しかし、データベース内の対応するデータ型(フィールド)のいくつかは整数であり、日付であることに気づきましたが、これで問題ありませんか?

4

2 に答える 2

9

setString()の代わりにPreparedStatement setObject()メソッドの使用を検討してください。

コンパイル時にタイプが不明な場合、 PreparedStatement setObject()はjava.langタイプの変換を試みます。

そのため、更新された for ループ (Java 5.0 を使用していると仮定) と一般的な null 処理を使用します。

int i = 0;
for(Object value : temp) {
    if (value == null) {
        // set null parameter if value type is null and type is unknown
        pstmt.setNull(++i, Integer.MIN_VALUE); 
    } else {
        pstmt.setObject(++i, value);
    }
}

setNull()は、既知の場合、2 番目のパラメーターとしてを受け入れることができることに注意してください。

于 2012-05-16T02:07:02.570 に答える
0

これは私を助けませんでした。以下は、バインド変数を追加した後に作成されたクエリです。ACC_NAME='java.lang.String'; の ACC_TABLE から ACC_NO を選択します。

java.lang.String 型に変換しようとすると、次の例外が発生します java.sql.SQLException: Could not execute sql command - Original message: null

私のACC_NAMEは「user01」です。したがって、実際には、クエリは次のようなものになるはずです。ACC_TABLE から ACC_NO を選択してください。

したがって、私の理解が間違っていなければ、 prepareStatement.setObject(index, object) はデータをそれぞれのデータ型に変換して設定しています。

MySQL の PreparedStatement.setObject(index, object) は問題なく問題なく動作しています。唯一の問題は、Oracle の使用中です。私が使用しているOracle DBのバージョンは

Oracle Database 11g Express Edition リリース 11.2.0.2.0 - 本番 PL/SQL リリース 11.2.0.2.0 - 32 ビット Windows 用の本番「CORE 11.2.0.2.0 本番」TNS: バージョン 11.2.0.2.0 - 本番 NLSRTL バージョン11.2.0.2.0 - 本番

于 2013-10-08T14:47:31.333 に答える