2012-05-16 6 views
6

ich über die folgenden Codes gekommen sind, halte ich es für die falsche Sache tut:PreparedStatement setString (...) für alle, auch wenn corrsponding Datentyp ist eine ganze Zahl

(Beachten Sie, dass das JDK ist 1.4.2 daher wird die Liste nicht typisiert)

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

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

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

das ist, was ich bin besorgt über:

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

aber ich habe festgestellt, dass einige der entsprechenden Datentypen (Feld) in der Datenbank sind integer, und Daten, wäre das in ordnung?

+1

Ich glaube nicht, dass es gut ist. Scheint, dass dies auf impliziter Konvertierung beruht, und das führt oft zu Trauer auf der Straße. – Glenn

+0

Ich rate "Temp" ist eine "Liste" - ist es generisch getippt? Bitte zeigen Sie ihre Erklärung an. –

+1

@Paul Bellora Temp ist eine ArrayList. Und es ist nicht getippt, weil dies Java ist. 1.4 –

Antwort

6

Verwenden Sie die Methode PreparedStatement setObject() anstelle von setString().

Der PreparedStatement setObject() werden alle von dem java.lang Typen für Sie zu konvertieren versuchen, wenn der Typ zum Zeitpunkt der Kompilierung nicht bekannt ist.

so mit einer for-Schleife aktualisiert (vorausgesetzt, Sie haben Java 5.0) und generische null Handhabung:

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

Beachten Sie, dass setNull() eine type als 2. Parameter annehmen kann, wenn bekannt ist.

+1

Danke pd40, ich würde eine kleine Notiz machen, dass setObject in Situationen nützlich wäre, wenn der Typ während der Kompilierung unbekannt ist. –

+2

Es ist völlig in Ordnung, 'setObject()' in diesem Fall zu verwenden. Vorsicht, Sie sollten nicht untypisiertes 'null' an' setObject() 'übergeben. +1 –

+0

Guter Punkt über den Nullfall. Ich füge das hinzu. Auch der Kommentar zur Kompilierzeit. – pd40

0

Das hat mir nicht geholfen. Unten ist die Abfrage nach dem Anhängen der Bind-Variablen erstellt. Wählen Sie ACC_NO aus ACC_TABLE, wobei ACC_NAME = 'java.lang.String';

Es wird versucht, java.lang.String Typen zu konvertieren und die Ergebnisse in der folgenden Ausnahme java.sql.SQLException: Kann nicht ausführen SQL-Befehl - Original-Nachricht: null

Wo, wie mein ACC_NAME ist ' Benutzer01 '. Also eigentlich sollte die Abfrage so etwas sein, ACC_NO aus ACC_TABLE where ACC_NAME = 'user01';

Wenn mein Verständnis also nicht falsch ist, konvertiert preparedStatement.setObject (index, object) die Daten in den entsprechenden Datentyp und setzt es.

preparedStatement.setObject (Index, Objekt) in MySQL funktioniert einwandfrei und ohne Probleme. Nur Problem bei der Verwendung von Oracle. Oracle DB-Version mit denen ich arbeite ist

Oracle Database 11g Express Edition Veröffentlichung 11.2.0.2.0 - Produktion PL/SQL Release 11.2.0.2.0 - Produktion "CORE 11.2.0.2.0 Production" TNS für 32-bit Windows: Version 11.2.0.2.0 - Produktion NLSRTL Version 11.2.0.2.0 - Produktion

Verwandte Themen