@@IDENTITY 用 SCOPE_IDENTITY() 替换试试。

解决方案 »

  1.   

    @@IDENTITY
    返回最后插入的标识值。
    SCOPE_IDENTITY()
    返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。
      

  2.   

    将 INSERT 语句和 SELECT SCOPE_IDENTITY() 放在同一个批执行肯定没问题的。而@@IDENTITY是全局的。
      

  3.   

    实在不行就用这个IDENT_CURRENT('table_name')参数
    table_name
    是将要返回其标识值的表的名称。table_name 的数据类型为 varchar,没有默认值。返回为任何会话和任何作用域中的特定表最后生成的标识值。
      

  4.   

    stmt.executeUpdate(SQL);
    既然是想返回值那么LZ的写法有点多余了这样的写法就很好了,没有必要去判断更新所影响的行数,然后决定是否去取identity的值把两句话放在一起执行可以保证返回的IDENTITY值绝对正确,
    而且如果返回的IDENTITY值0那么肯定是执行失败了,程式中少做了很多无用功
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(SQL +";SELECT @@IDENTITY");
    if (rs.next()) {
    nCreateId = rs.getInt(1);
    }
    rs.close();或者在传入SQL这个参数之前就在后面加上+";SELECT @@IDENTITY"
    另外建议用SCOPE_IDENTITY()替代@@IDENTITY,因为@@IDENTITY是全局变量,而SCOPE_IDENTITY()的作用域只限于当前连接,虽然这样的替换不是必要,但是相信LZ应该很清楚使用全局变量和局部变量那个更好