如何知道插入查询是否在anorm中成功?

时间:2013-10-12 10:17:50

标签: sql scala playframework anorm

我在Play应用程序中使用Anorm进行数据库查询。我做了一些教程,如果执行成功,SQL(....).execute()返回Boolean。我测试了该方法,但它始终返回false(不知道何时返回true:/)。我也尝试了SQL(...).executeInsert(),但表中没有任何“自动增量”列,因此问题仍然存在。如果有任何解决方案(任何扩展版本的'.execute()'方法或其他),请帮助我。

这是我的代码的一部分,由于意外返回而失败...

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

更新查询应仅在插入失败时运行(由于任何约束等)。还有其他功能/替代方案吗?请帮忙。提前致谢。

2 个答案:

答案 0 :(得分:7)

对.execute()的Anorm调用委托给jdbc PreparedStatement类上的.execute(),如果结果是ResultSet则返回true,如果是“更新计数”则返回false,或者没有结果返回,所以它不符合你的预期。

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

只要execute()调用没有抛出SqlException,我希望插入成功。 (您可以通过尝试插入具有表中已有ID的条目来轻松验证这一点)

答案 1 :(得分:-2)

你应该使用Option [Long]

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

此处状态变量具有true或false值。