MySQLSyntaxErrorException cerca de "?" al intentar ejecutar PreparedStatement

Resuelto Zen asked hace 13 años • 2 respuestas

Estoy intentando ejecutar una consulta utilizando PreparedStatement en Java.

Recibo el error número 1064 cuando intento ejecutar mi consulta (error de sintaxis).

Probé esto en el navegador de consultas MySQL con valores sustituidos que funciona bien.

¿Qué pasa con mi código?

Aquí está el código relevante:

String query = "select MemberID, MemberName from members where MemberID = ? or MemberName = ?";
Connection conn = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, 2);
s.setString(2, "zen");
ResultSet rs = s.executeQuery(query);

Esta es la excepción que recibo:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tiene un error en su sintaxis SQL; Consulte el manual correspondiente a la versión de su servidor MySQL para conocer la sintaxis correcta que debe utilizar cerca de '? o Nombre de miembro =?' en la línea 1

Zen avatar Nov 09 '10 13:11 Zen
Aceptado

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Tiene un error en su sintaxis SQL; Consulte el manual correspondiente a la versión de su servidor MySQL para conocer la sintaxis correcta que debe utilizar cerca de '? o nombre de miembro =?' en la línea 1

MySQL no comprende el significado de ?en la consulta SQL. De hecho, es una sintaxis SQL no válida. Entonces de alguna manera no ha sido reemplazado por PreparedStatement. ¿Y adivina qué?

PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(query); // Fail!

¡Estás anulando la consulta preparada con la consulta original! Debe llamar al PreparedStatement#executeQuery()método sin argumentos en lugar de Statement#executeQuery(String).

PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);        
rs = s.executeQuery(); // OK!

Sin relación con el problema, su código está perdiendo recursos. La base de datos se quedará sin ellos después de varias horas y su aplicación fallará. Para solucionar este problema, debe seguir el modismo JDBC de cierre Connectiony en el bloque del bloque donde se adquirieron Statement. Consulte el tutorial básico de JDBC para obtener más detalles.ResultSetfinallytry

BalusC avatar Nov 10 '2010 02:11 BalusC