2017-12-19 26 views
-1

데이터베이스에 삽입하려고하는데 SQLException: Problem in your syntax, line 2이 표시됩니다. 그래서 콘솔을 실행하기 전에 쿼리를 출력 한 다음 SQL 셸에 붙여 넣었습니다. 문제없이 실행되었습니다. 내가 뭘 잘못하고 있는지 모르겠다. 도와주세요.Java SQL에 잘못된 sytax가 있지만 쉘에서 쿼리를 실행하면 작동 함

Utilizador u = new Aluno("A55555","password","[email protected]","Cinco",false,new HashMap<>()); 
new UserDAO().put(u.getUserNum(),u); 

SQL 쿼리 제작 :

START TRANSACTION; 
INSERT INTO `Utilizador` (id, nome,pass, Email) 
VALUES ('A55555', 'Cinco', 'password', '[email protected]') 
ON DUPLICATE KEY UPDATE id=VALUES(id), 
    pass=VALUES(pass), 
    nome=VALUES(nome), 
    Email=VALUES(Email); 
INSERT INTO `Aluno` (Utilizador_id, eEspecial) 
VALUES ('A55555',0) 
ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id), 
          eEspecial=VALUES(eEspecial); 

자바 :

String sql = "START TRANSACTION;\n" + 
     "INSERT INTO `Utilizador` (id, nome,pass, Email) \n" + 
     "VALUES (?, ?, ?, ?)\n" + 
     "ON DUPLICATE KEY UPDATE id=VALUES(id),\n" + 
     "      pass=VALUES(pass),\n" + 
     "      nome=VALUES(nome),\n" + 
     "      Email=VALUES(Email);\n"; 
StringBuilder s = new StringBuilder(sql); 
if (value instanceof Docente){ 
    s.append("INSERT INTO `Docente` (Utilizador_id)\n" + 
      "VALUES (?)\n" + 
      "ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id);"); 
}else if (value instanceof Aluno){ 
    s.append("INSERT INTO `Aluno` (Utilizador_id, eEspecial)\n" + 
      "VALUES (?,?)\n" + 
      "ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id), eEspecial=VALUES(eEspecial);"); 
}else if (value instanceof DiretorDeCurso){ 
    s.append("INSERT INTO `DiretorDeCurso` (Utilizador_id)\n" + 
      "VALUES (?)" + 
      "ON DUPLICATE KEY UPDATE Utilizador_id=VALUES(Utilizador_id);\n"); 
}else{ 
    return null; 
} 
System.out.println(s.toString()); 
PreparedStatement stm = connection.prepareStatement(s.toString()); 
stm.setString(1, value.getUserNum()); 
stm.setString(2, value.getName()); 
stm.setString(3, value.getPassword()); 
stm.setString(4, value.getEmail()); 
stm.setString(5, value.getUserNum()); 
if(value instanceof Aluno) stm.setBoolean(6,((Aluno) value).eEspecial()); 
System.out.println(stm.toString()); 
stm.executeUpdate(); 
+4

예외의 정확한 스택 추적을 게시하십시오. 하나의 명령문에서 여러 개의 쿼리를 실행한다는 것에주의하십시오. 그것은 MySQL에 의해 받아 들여질 수도 있지만 일반적으로 그렇지 않습니다. –

+2

SQL에'\ n'을 명시 적으로 포함하는 것은 이상합니다. – chrylis

+0

트랜잭션은 일반적으로 SQL 문을 사용하는 대신 API를 사용하여 시작됩니다. 그러나 이것이 특정 문제의 원인이 될 수있는 경우에는 도움이되지 않습니다. – treeno

답변

0

StatementPreparedStatement는 배수가 아닌, 하나의 문장에 대한 것입니다. 한 번에 하나씩 실행해야합니다.