2012-05-16 24 views
6

me he encontrado con los siguientes códigos creo que está haciendo las cosas mal:PreparedStatement setString (...) para todos, incluso si corrsponding tipo de datos es un entero

(Tenga en cuenta que esto es JDK 1.4.2 , por lo tanto, la lista no se escribe)

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

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

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

Esto es lo que me preocupa:

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

Pero he observado que algunos de los tipos de datos correspondientes (de campo) en la base de datos son números enteros, y fechas, esto estaría bien?

+1

No creo que sea bueno. Parece que se basa en la conversión implícita, y que a menudo conduce a la pena en el futuro. – Glenn

+0

Supongo que 'temp' es una' Lista' - ¿está escrito genéricamente? Por favor, muestre su declaración. –

+1

@Paul Bellora temp es una ArrayList. Y no está escrito porque es Java 1.4 –

Respuesta

6

Considere utilizar el método PreparedStatement setObject() en lugar de setString().

El PreparedStatement setObject() intentará convertir cualquiera de los java.lang tipos para usted si el tipo es desconocido en tiempo de compilación.

por lo que con una versión actualizada de bucle (suponiendo que tiene Java 5.0) y la manipulación nula genérica:

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

Tenga en cuenta que setNull() puede aceptar una type como el segundo parámetro si se sabe.

+1

Gracias pd40, me gustaría hacer una pequeña nota de que setObject sería útil en situaciones cuando el tipo es desconocido durante el tiempo de compilación. –

+2

Está perfectamente bien usar 'setObject()' en este caso. Tenga cuidado, no debe pasar '' null' sin tipeo a 'setObject()'. +1 –

+0

Buen punto sobre el caso nulo. Añadiré eso. También el comentario sobre el tiempo de compilación. – pd40

0

Esto no me ayudó. A continuación se muestra la consulta generada después de agregar las variables de vinculación. seleccione ACC_NO de ACC_TABLE donde ACC_NAME = 'java.lang.String';

Se trata de convertir al tipo java.lang.String y que da lugar a la siguiente excepción java.sql.SQLException: No se pudo ejecutar comandos SQL - Mensaje original: null

Donde como mi ACC_NAME es ' usuario01 '. Así que en realidad la consulta debería ser algo como esto, seleccione ACC_NO de ACC_TABLE donde ACC_NAME = 'usuario01';

Si mi comprensión no es incorrecta, preparedStatement.setObject (index, object) está convirtiendo los datos a su tipo de datos respectivo y configurándolos.

preparedStatement.setObject (index, object) en MySQL está funcionando perfectamente bien sin problemas. El único problema es durante el uso de Oracle. versión de Oracle DB estoy trabajando con es

base de datos Oracle 11g Express Edition Release 11.2.0.2.0 - Producción PL/SQL Release 11.2.0.2.0 - Producción "núcleo 11.2.0.2.0 Producción" TNS para Windows de 32 bits: Versión 11.2.0.2.0 - Producción NLSRTL Versión 11.2.0.2.0 - Producción

Cuestiones relacionadas