2012-05-16 1 views
6

ho incontrato i seguenti codici sento che sta facendo la cosa sbagliata:PreparedStatement setString (...) per tutti, anche se corrsponding tipo di dati è un numero intero

(Si noti che questo è JDK 1.4.2 , pertanto l'elenco non è digitato)

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

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

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

Questo è quello che mi preoccupa:

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)); 
} 

ma ho notato che alcuni dei tipi di dati corrispondenti (campo) nel database sono interi, e date, questo va bene?

+1

Non penso che sia buono. Sembra che questo si basi sulla conversione implicita, e che spesso porta al dolore lungo la strada. – Glenn

+0

Sto indovinando che 'temp' è un' Elenco' - è tipicamente tipizzato? Si prega di mostrare la sua dichiarazione. –

+1

@Paul Bellora temp è una lista di array. E non è stato digitato perché si tratta di Java 1.4 –

risposta

6

Prendere in considerazione l'utilizzo del metodo PreparedStatement setObject() anziché setString().

Il PreparedStatement setObject() tenterà di convertire qualsiasi del java.lang tipi per voi se il tipo è sconosciuto al momento della compilazione.

così con una versione aggiornata per il ciclo (ammesso che abbiate java 5.0) e la movimentazione nulla generico:

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); 
    } 
} 

noti che setNull() può accettare un type come il secondo parametro se è noto.

+1

Grazie a pd40, vorrei fare una piccola nota che setObject sarebbe utile in situazioni in cui il tipo è sconosciuto durante la compilazione. –

+2

In questo caso è perfetto usare 'setObject()'. Attenzione, non dovresti passare "null" non tipizzato a "setObject()". +1 –

+0

Buon punto sul caso nullo. Lo aggiungerò. Anche il commento sul tempo di compilazione. – pd40

0

Questo non mi ha aiutato. Di seguito è riportata la query creata dopo l'aggiunta delle variabili di binding. seleziona ACC_NO da ACC_TABLE dove ACC_NAME = 'java.lang.String';

Si sta cercando di convertire in tipo java.lang.String e che si traduce nella seguente eccezione java.sql.SQLException: Impossibile eseguire SQL comando - Messaggio originale: null

Dove come il mio ACC_NAME è ' user01' . Quindi la query dovrebbe essere qualcosa del genere, selezionare ACC_NO da ACC_TABLE dove ACC_NAME = 'user01';

Quindi, se la mia comprensione non è sbagliata, preparedStatement.setObject (index, object) sta convertendo i dati nel rispettivo tipo di dati e impostandolo.

preparedStatement.setObject (index, object) in MySQL funziona perfettamente bene senza problemi. L'unico problema è quando si utilizza Oracle. versione di Oracle DB Sto lavorando con è

Oracle Database 11g Express Edition uscita 11.2.0.2.0 - Produzione PL/SQL di uscita 11.2.0.2.0 - Produzione "core 11.2.0.2.0 Production" TNS per Windows a 32 bit: Versione 11.2.0.2.0 - Produzione NLSRTL Versione 11.2.0.2.0 - Produzione