2013-10-12 5 views
6

Sto usando Anorm per le query del database nella mia applicazione Play. Sono passato attraverso alcuni tutorial che è dato che SQL(....).execute() restituisce Boolean se l'esecuzione era riuscita. Ho provato il metodo, ma ha sempre restituito false (non so quando restituisce true: /). Ho anche provato SQL(...).executeInsert() ma non c'è alcuna colonna di "auto-incremento" nella tabella, quindi il problema esiste ancora. Per favore aiutatemi se c'è qualche soluzione (qualsiasi versione espansa del metodo '.execute()' o altro) con chiunque.Come sapere se una query di inserimento era riuscita in anorm?

Ecco una parte del mio codice che sta fallendo a causa di inaspettato ritorno ...

def addSuggestion(sessionId: BigInteger, suggestionId: BigInteger) = { 
     DB.withConnection { implicit c => 
      if (!SQL("insert into user_suggestion_" + sessionId + " values (" + suggestionId + ",1,0,0)").execute()) { 
      SQL("update user_suggestion_" + sessionId + " set count=(count+1) where user_id=" + suggestionId).executeUpdate() 
      } 
     } 
     } 

La query di aggiornamento deve essere eseguito solo quando l'inserimento fallisce (a causa di qualsiasi vincolo, ecc). C'è qualche altra funzione/alternativa? Per favore aiuto. Grazie in anticipo.

risposta

7

La chiamata di Anorm a .execute() delegati a .execute() sulla classe jdbc PreparedStatement, che restituisce true se il risultato è un ResultSet e false se è un "conteggio di aggiornamento" o nessun risultato è tornato, quindi non fa quello che ti aspettavi.

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#execute()

mi aspetterei l'inserto per avere successo fino a quando la chiamata execute() non gettare uno SqlException. (Si potrebbe verificare abbastanza facilmente cercando di inserire una voce con un id che si trova nella tabella)

+0

Grazie Johanandren .. Ora ho effettivamente capito la funzione. Quindi, devo verificare il corretto inserimento tramite Exception Handling? Non c'è un modo semplice? –

+0

Pensa a come controllare un comportamento eccezionale con la gestione delle eccezioni :). Controlla scala.util.Try, potrebbe darti un modo migliore di gestire quell'eccezione rispetto a un try-catch. – johanandren

-2

Si consiglia di utilizzare l'opzione [Lungo]

val status:Option[Long]=SQL("insert into user_suggestion_" + sessionId + " values (" + suggestionId + ",1,0,0)").execute() 

qui variabile di stato ha valori true o false.

+0

Spiacente Ravi, ma il metodo 'execute()' restituisce solo 'Booleano'. Non risolve il problema. –

Problemi correlati