JDBC-Ausnahme: MySQLSyntaxError mit gültiger SQL-Anweisung
In diesem Artikel befassen wir uns mit einem Problem, das bei der Verwendung von JDBC zum Einfügen von Daten in a auftritt MySQL-Datenbank. Wir haben eine MySQLSyntaxError-Ausnahme erhalten, obwohl eine gültige INSERT-Anweisung in MySQL Workbench ausgeführt wurde.
Um die zugrunde liegende Ursache zu untersuchen, analysieren wir den Code:
<code class="java">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; }</code>
Untersuchen des Stack-Trace:
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
Dieser Fehler weist darauf hin, dass in der SQL-Anweisung ein Syntaxfehler vorliegt. Unsere INSERT-Anweisung scheint jedoch korrekt zu sein.
Bei näherer Betrachtung stellen wir fest, dass die MethodeexecuteUpdate() ein String-Argument SQLCommandInserim anstelle des PreparedStatement sInserim verwendet. Dies ist ein Versehen im Code.
Lösung:
Um dieses Problem zu beheben, ersetzen Sie die folgende Zeile:
<code class="java">sInserim.executeUpdate(sqlCommandInserim);</code>
Durch:
<code class="java">sInserim.executeUpdate();</code>
Durch den Aufruf vonexecuteUpdate() für PreparedStatement ersetzt JDBC die Platzhalter (?) durch die mit der setString()-Methode festgelegten Werte und verhindert so den Syntaxfehler.
Zusätzliche Überlegungen:
Es wird außerdem empfohlen, den „finally“-Block zu verwenden, um alle Datenbankobjekte (PreparedStatements, Connections, Statements und ResultSets) zu schließen, um Ressourcenlecks im Falle von Ausnahmen zu verhindern.
Das obige ist der detaillierte Inhalt vonWarum löst mein JDBC-Code trotz Verwendung einer gültigen INSERT-Anweisung eine MySQLSyntaxErrorException aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!