2017-12-19 7 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); 

のJava:

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

例外の正確で完全なスタックトレースを送信します。 1つのステートメントで複数のクエリを実行していることに注意してください。それはMySQLによって受け入れられるかもしれませんが、一般的にそうではありません。 –

+2

SQLに '\ n'を明示的に含めることも奇妙です。 – chrylis

+0

トランザクションは、通常、SQL文を使用する代わりにAPIを使用して開始されます...しかし、これがあなたの特定の問題の原因である可能性があるならば、気にしないでください。 – treeno

答えて

0

StatementPreparedStatementは、複数のない、単一の文のためのものです。一度に1つずつ実行する必要があります。

関連する問題