mysql-connector-java-5.1.31-bin.jar descargar
MySQLSyntaxErrorException cerca de "?" Al intentar ejecutar PreparedStatement (1)
Estoy tratando de ejecutar una consulta utilizando un PreparedStatement en Java.
Recibo el error número 1064 cuando intento ejecutar mi consulta (error de sintaxis).
He probado 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; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''? o MemberName =? '' en la línea 1
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''? o MemberName =? '' en la línea 1
MySQL no entiende el significado de ?
en la consulta SQL. De hecho, es una sintaxis SQL no válida. De alguna forma, 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! Necesita llamar al método sin argumentos de PreparedStatement#executeQuery()
lugar de Statement#executeQuery(String)
.
PreparedStatement s = conn.prepareStatement(query);
s.setInt(1, intValue);
s.setString(2, strValue);
rs = s.executeQuery(); // OK!
No relacionado con el problema, tu código está perdiendo recursos. El DB se agotará después de varias horas y su aplicación fallará. Para solucionar esto, debe seguir el modismo JDBC de cerrar Connection
, Statement
y ResultSet
en el bloque finally
bloque try
donde se han adquirido. Consulte el tutorial básico de JDBC para obtener más detalles.