数据库中 Id 列是自动增长;
运用 java 语句向数据库中插入一条数据,并返回这条数据的 ID 
我使用的是 SQLServer 数据库。
在查询分析器中可以使用 SELECT  SCOPE_IDENTITY() 能够得到刚刚插入数据的 ID
可是在 java 中使用这条语句却无法得到正确结果。
以下是我的代码:String sql = "insert into communityGTTitle values(?)";
String sql2 = "SELECT  SCOPE_IDENTITY() as temp";
String username = "username";Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;databaseName=A_Hospital","hello","hello");
PreparedStatement ps = null;
PreparedStatement ps2 = null;
ResultSet rs = null;
try{
    ps = con.prepareStatement(sql);
    ps.setString(1, username );
    ps.execute();
    ps2 = con.prepareStatement(sql2);
    rs = ps2.executeQuery();
    rs.next();
    System.out.println(rs.getInt("temp"));
}catch(Exception exception){
    exception.printStackTrace();
}这样并不能得到正确的结果,输出的结果一直是 0 
请求高手指教

解决方案 »

  1.   

    JDBC 3.0 有这个功能的
     pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS); // 这句的参数是关键 
          setPreparedStatementValue(pstat, base); 
          if (pstat.executeUpdate() == 1) { 
            rs = pstat.getGeneratedKeys();  // 用来获得生成的数值 
            if (rs.next()) { 
              long newId = Long.parseLong(rs.getString(1)); // 拿到数值 
            } 
        }from: http://www.java2000.net/viewthread.jsp?tid=367
      

  2.   

    转贴:http://hi.baidu.com/linkinmao/blog/item/0147a282471de0bd6c811985.html
    SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。 IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
    @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
    SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
    例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。
    假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
    @@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
    SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
    而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。
      

  3.   

    我也遇到过这种情况,我没有建两个Statement,在一个Statement中做的,类似
    Statement st=con.createStatement();
    String sql="insert ... into ....";
    st.execute(sql);
    rs=st.excute("SELECT  SCOPE_IDENTITY()");具体代码我现在没有,单应该就是真么做的
      

  4.   

    老紫竹,
    你给的代码 pstat = con.prepareStatement(insertSQ, Statement.RETURN_GENERATED_KEYS);
    这句总是报以下这个异常啊!搞了半天弄不出来,只能在请教了!
    Exception in thread "main" java.lang.AbstractMethodError: com.microsoft.jdbc.sqlserver.SQLServerConnection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;
      

  5.   

    ps.execute();
    这句执行完之后,检验一下数据库里有数据了么.
    看看ps.executeUpdate() 
      

  6.   

    我对JDBC不熟 我觉得execute之后很可能数据库里并没有真正刷新数据
    可以试试用存储过程插入后直接获取
    伪码:把插入sql写成存储过程,@identity   在返回参数中取得,返回参数加output.   
      CREATE   PROCEDURE     
      (   
              @ID                           numeric(9,0)   output,   
              其他要插入的参数   
      )   
      AS   
      BEGIN   
      INSERT   INTO   ……   
      SELECT   @ID=@@identity   --取得identity   
      ……   
      end   
        
        
    调用时用CallableStatement,   
    cstmt.registerOutParameter(1,   java.sql.Types.INTEGER);   
    cstmt.executeUpdate();   
    ID   =   cstmt.getInt(1);   
    该ID就是刚刚插入的identity.
      

  7.   

    你报异常,是因为你用的不是JDBC 3.0的驱动,快换掉那3个jar的老驱动吧。哈哈哈!我的方法才是正确的,希望你能快乐!http://www.java2000.net/download.jsp  我这里有最新的sql server 2000 的驱动, 微软SQL 2005 JDBC 兼容 2000