2011-09-27 2 views
0

MySQL 데이터베이스와 통신하는 Java 응용 프로그램을 작성 중이며 테스트하는 동안 테이블에 새 행을 삽입하는 코드가 MySQLSyntaxError 예외를 던졌습니다. MySQL Workbench를 사용하여 동일한 INSERT를 실행하려고 시도했지만 작동했습니다.JDBC가 올바른 구문을 사용하여 MySQLSyntaxError 예외를 반환 함

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) '

이러한 자리 표시 자 ?은 MySQL 측에 표시되어서는 안됩니다. 여기

봐,

sInserim.executeUpdate(sqlCommandInserim); 

대신 설정 값으로 PreparedStatement을 실행 executeUpdate()에 원시 SQL 문자열을 전달하고 있습니다.

Statement에 사용되어야한다

sInserim.executeUpdate(); 

executeUpdate(sqlString)하여 교체합니다. 구체적인 문제에


관련없는

, 당신은 예외의 경우 누출 자원을 방지하기 위해 finally 블록에서 PreparedStatement을 종료해야합니다. 또한 Connection, StatementResultSet에도 동일하게 적용됩니다.

+0

신난다 !! 이것은 나를 위해 큰 일을했다. –

관련 문제