2011-09-27 50 views
0

我正在寫一個與MySQL數據庫通信的java應用程序,當我測試它時,我注意到在表中插入新行的代碼拋出MySQLSyntaxError異常,所以我試圖使用MySQL Workbench執行相同的INSERT,並且工作正常。有問題的代碼是這樣的:用正確的語句返回MySQLSyntaxError異常的JDBC

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); 
      ResultSet risultatiUtente=sUser.executeQuery(); 
      String utente = null; 
      while(risultatiUtente.next()){ 
       utente=risultatiUtente.getString(1); 
      } 
      sUser.close(); 
      PreparedStatement sInserim=conn.prepareStatement(sqlCommandInserim); 
      sInserim.setString(1, utente); 
      sInserim.setString(2, nome); 
      //sInserim.setObject(3,g); 
      System.out.println(sInserim.toString()); 
      sInserim.executeUpdate(sqlCommandInserim); 
      sInserim.close(); 
      return true; 
     } 
     catch(SQLException e){ 
      e.printStackTrace(); 
      return false; 
     } 
    } 
    else 
     return false; 
} 

編輯:對不起,堆棧跟蹤是:

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 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 
at com.mysql.jdbc.Util.getInstance(Util.java:382) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664) 
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583) 
at se.diag.control.clientspec.UtilsClientSQL.aggiungiElem(UtilsClientSQL.java:67) 
at se.diag.control.clientspec.UtilsClientSQLTest.testAggiungiElem(UtilsClientSQLTest.java:67) 
at se.diag.control.clientspec.UtilsClientSQLTest.testCaricaElem(UtilsClientSQLTest.java:99) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) 
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) 
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) 
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) 
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66) 
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) 
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) 
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) 
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
+0

如果您提供了堆棧跟蹤,將會更容易幫助您。 – Thor84no

回答

5

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一個錯誤的SQL語法;檢查與您的MySQL服務器版本相對應的手冊,以便在''附近使用正確的語法'? ,? ,DEFAULT,NULL)'在第1行

那些佔位符?根本不應該出現在MySQL端。

看這裏,

sInserim.executeUpdate(sqlCommandInserim); 

你傳遞的原始SQL字符串轉換成executeUpdate(),而不是執行PreparedStatement與設定值。

通過

sInserim.executeUpdate(); 

executeUpdate(sqlString)替換它應該只Statement使用。


無關的具體問題,您應該在finally塊被關閉PreparedStatement,以避免資源在例外的情況下,泄漏。順便說一下,ConnectionStatementResultSet也是一樣的。

+0

真棒!這對我很好 –