Exceção JDBC: MySQLSyntaxError com instrução SQL válida
Neste artigo, investigamos um problema encontrado ao usar JDBC para inserir dados em um Banco de dados MySQL. Recebemos uma exceção MySQLSyntaxError apesar de executar uma instrução INSERT válida no MySQL Workbench.
Para investigar a causa subjacente, vamos analisar o 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 o rastreamento de pilha:
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 erro indica que há um erro de sintaxe na instrução SQL. No entanto, nossa instrução INSERT parece estar correta.
Após uma inspeção mais detalhada, notamos que o método executeUpdate() usa um argumento String SQLCommandInserim em vez do PreparedStatement sInserim. Isso é um descuido no código.
Solução:
Para resolver esse problema, substitua o seguinte linha:
sInserim.executeUpdate(sqlCommandInserim);
Com:
sInserim.executeUpdate();
Invocando executeUpdate () no PreparedStatement, o JDBC substituirá os espaços reservados (?) pelos valores definidos usando o método setString(), evitando o erro de sintaxe.
Considerações adicionais:
Também é recomendado usar o bloco final para fechar todos os objetos do banco de dados (PreparedStatements, Connections, Statements e ResultSets) para evitar vazamentos de recursos em caso de exceções.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3