6

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

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

4

2 回答 2

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 的条目来很容易地验证这一点)

于 2013-10-14T14:05:23.323 回答
-2

你应该使用 Option[Long]

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

这里状态变量具有真值或假值。

于 2013-10-12T10:22:59.673 回答