2013-10-12 63 views
6

我在我的Play應用程序中使用Anorm進行數據庫查詢。我經歷了一些教程,如果執行成功,SQL(....).execute()返回Boolean。我測試了這個方法,但它總是返回false(不知道它何時返回true:/)。我也嘗試過SQL(...).executeInsert(),但表中沒有任何'自動增量'列,所以問題依然存在。如果有任何解決方案(任何擴展版本的'.execute()'方法或其他),請幫助我。如何知道如果插入查詢在anorm中成功?

這裏是我的代碼失敗由於意外收益的一部分......

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() 
      } 
     } 
     } 

當插入失敗(因爲任何約束等)的更新查詢應該只運行。還有其他功能/替代方案嗎?請幫忙。提前致謝。

回答

7

對於.execute()的Anorm調用委託給jdbc PreparedStatement類的.execute(),如果結果是ResultSet則返回true;如果返回結果爲「update count」或返回結果,則返回false,所以它不會做你期望的。

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

我希望插入成功,只要execute()調用沒有拋出SQLException。 (你可以通過嘗試插入一個表中已經有的id的條目來驗證這一點)

+0

謝謝Johanandren ..現在我真的瞭解了這個功能。那麼,我是否必須通過異常處理來檢查插入是否成功?沒有任何簡單的方法嗎? –

+0

把它想象爲檢查異常處理的異常行爲:)。看看scala.util.Try,它可能會給你一個更好的方法來處理這個異常,而不是一個try-catch。 – johanandren

-2

您應該使用選項[龍]

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

此狀態變量具有true或false值。

+0

對不起Ravi,但'execute()'方法只返回'Boolean'。它不能解決問題。 –

相關問題