Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID

Posted

技术标签:

【中文标题】Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID【英文标题】:Java, PreparedStatement, TransactSQL (MS SQL), last insert id 【发布时间】:2010-11-30 13:55:36 【问题描述】:

我使用 PreparedStatement 将一些值插入到数据库中,但在这种情况下,我似乎无法检索最后一个插入 ID。

我尝试使用与 Statements 相同的语句(如下),但它不起作用。它说,在这种情况下 .executeQuery() 不能接受参数。

事实上,我并不完全需要最后一个插入 id,受影响的行数就可以了,但我如何得到呢?我认为 PreparedStatement 的 .executeUpdate() 方法会返回受影响的行数,但显然它没有。

方法如下。

 public static int getLastInsertId(Statement stmt) throws SQLException 
  String sql = "SELECT SCOPE_IDENTITY() AS id";

  ResultSet rs = stmt.executeQuery(sql);
  int id = 0;
  while (rs.next()) 
   id = rs.getInt("id");
  
  return id;
 

提前谢谢你。

【问题讨论】:

从不关闭结果集? 当您从控制台或任何前端执行此查询时,您会看到什么? 感谢您指出这一点。我通常会这样做,我保证:) 问题是这个 PreparedStatement 中的查询是有条件的(见下文),当我在 MS SQL 管理器中运行它时,它不会插入任何东西(原样预期)。 if ((select COUNT(id) as quantity from tNewSchedule where ManID = 464 and (type & 264) > 0 and status = 0) = 0) BEGIN INSERT INTO tnewschedule (type, to_review, manid , 父) -- 值 (300, '2010-11-30 16:30:16.036', 464, 271);结束 【参考方案1】:

PreparedStatement 的 executeUpdate 方法确实返回了受影响的行数...

【讨论】:

显然是这样。我对他们的 javadoc 中的措辞有点失望,而且我有点混淆了我的preparedstatement 的参数(它们很多)。谢谢,对我的错误深表歉意。

以上是关于Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID的主要内容,如果未能解决你的问题,请参考以下文章

线程中的 PreparedStatement (java)

Java中PreparedStatement和Statement的用法区别

Java 的 PreparedStatement 是如何工作的?

Java_JDBC使用Statement和PreparedStatement

java Java - JDBC - preparedStatement

Java、PreparedStatement、TransactSQL (MS SQL)、最后插入 ID