"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que meu código JDBC lança uma MySQLSyntaxErrorException apesar de usar uma instrução INSERT válida?

Por que meu código JDBC lança uma MySQLSyntaxErrorException apesar de usar uma instrução INSERT válida?

Publicado em 2024-11-07
Navegar:905

Why does my JDBC code throw a MySQLSyntaxErrorException despite using a valid INSERT statement?

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.

Tutorial mais recente Mais>

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