Excepción de JDBC: MySQLSyntaxError con declaración SQL válida
En este artículo, profundizamos en un problema encontrado al usar JDBC para insertar datos en un Base de datos MySQL. Recibimos una excepción MySQLSyntaxError a pesar de ejecutar una instrucción INSERT válida en MySQL Workbench.
Para investigar la causa subyacente, analicemos el código:
public static boolean aggiungiElem(String nome, GrafoGenerico g){
if(connessioneAperta()){
try{
String sqlCommandUser = "SELECT USER()";
String sqlCommandInserim = "INSERT INTO salvataggi VALUES ( ? , ? , DEFAULT , NULL );";
PreparedStatement sUser = conn.prepareStatement(sqlCommandUser);
... // Execute user query
PreparedStatement sInserim = conn.prepareStatement(sqlCommandInserim);
sInserim.setString(1, utente);
sInserim.setString(2, nome);
System.out.println(sInserim);
sInserim.executeUpdate(sqlCommandInserim);
... // Close PreparedStatements and ResultSet
}
catch(SQLException e){
e.printStackTrace();
return false;
}
}
else
return false;
}
Examinando el seguimiento de la pila:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? , ? , DEFAULT , NULL )' at line 1
Este error indica que hay un error de sintaxis en la declaración SQL. Sin embargo, nuestra declaración INSERT parece ser correcta.
Tras una inspección más cercana, notamos que el métodoexecuteUpdate() toma un argumento de cadena SQLCommandInserim en lugar de PreparedStatement sInserim. Esto es un descuido en el código.
Solución:
Para resolver este problema, reemplace la siguiente línea:
sInserim.executeUpdate(sqlCommandInserim);
With:
sInserim.executeUpdate();
Al invocar enableUpdate() en PreparedStatement, JDBC reemplazará los marcadores de posición (?) con los valores establecidos usando el método setString(), evitando el error de sintaxis.
Consideraciones adicionales:
También se recomienda usar el bloque finalmente para cerrar toda la base de datos objetos (PreparedStatements, Connections, Statements y ResultSets) para evitar fugas de recursos en caso de excepciones.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3