在公司写的的项目里面,添加新数据的时候,经常要用到添加完之后要返回新数据的ID,于是就在insert后面加上了select SCOPE_IDENTITY()这句代码。
奇怪的是,有些表加上这句代码可以顺利返回ID,但另一些表却报:“该语句没有返回结果集。”
最神奇的是:之前一直能够正常返回ID的表,今天用着用着也突然间不能返回了,也报:“该语句没有返回结果集”这个异常了,这是怎么回事呢?
谢谢你。

解决方案 »

  1.   

    呃呃,仔细看一下,是否有破绽:
    http://msdn.microsoft.com/zh-cn/library/ms190315.aspx
      

  2.   

    当然是自增类型的。insert出错应该报的不是这个异常吧,应该是其他提示吧
      

  3.   

    select SCOPE_IDENTITY()这句的前面应该是加了其他操作了。
      

  4.   

    select scope_identity();或者select max(id)
      

  5.   

    最令我觉得不解的是:上午还用得好好的,下午突然就出现那个问题。
    刚才我修改了一下代码,原来insert语句是和select scope_identity();连载一起写的,现在分开了就行了。
    原来的代码:
    ResultSet rs=db.executeQuery(insert into table1 values (a, b, c);select scope_identity())
    现在的代码:
    boolean ok=db.executeUpdate(insert into table1 values (a, b, c))
    ResultSet rs=db.executeQuery(select scope_identity())说明:db是数据类的对象变量。
    现在的代码执行的时候,我是很担心的,因为尽管可能性不大,但还是存在一种情况:两个甚至更多个用户同时添加记录,取出来的id就说不清楚了。
      

  6.   

    3种返回最大标志值方法试试使用DENT_CURRENT  返回为任何会话和任何作用域中的特定表最后生成的标识值。
      

  7.   


    最好还是按你第一次写的那样做,select scope_identity() 是马上获得当前作用域insert语句里的最后标识值!
    分开写时insert已经执行完!作用域应该不会返回结果。
      

  8.   

    应该是 executeQuery 在访问SQL 时 SQL中的 Scope_identity() 已消失!
    你错误的效果应该如下例句:
    Insert Into #tb values('1','1')
    Select * from  #tb
    Select Scope_identity()
      

  9.   


    以你所用语句为例,在查询分析器(2000)或SSMS中执行以下语句:
    create proc spname --spname是存储过程名称,请自行修改
    (
    @a int,
    @b int,
    @c int --这三个是参数名称和类型,可根据实际自行修改
    )
    as
    begin
    insert into table1 values (@a, @b, @c);
    select scope_identity()
    end
    以上语句即生成了一个名为spname的存储过程,然后将程序中的语句改为
    ResultSet rs=db.executeQuery(exec spname a,b,c)应该就可以了
      

  10.   

    刚才测试了一下,用存储过程,确实可以返回id,但因为我的系统里面有很多表,有些表还有几十列。如果用存储过程的话,1、要生成很多存储过程,这需要不少时间;2、有些存储过程,需要几十个变量,因为表里有几十列。这样需要很大的工作量的啊!
    我想了个偷懒的办法,就是把insert tableName values (xxxx, xxxx)这个语句,作为一个变量,然后在存储过程里面用exec来执行,这样我就只需要生成一个存储过程就可以了。结果,select scope_identity()的结果是null。也就是说,我这个办法行不通了。
    请问有没有简单一些办法,用一个存储过程,就可以任何表在这个存储过程里面“insert ”的之后,都可以取出id呢?
      

  11.   

    insert 出现问题了,可能是有些表在select SCOPE_IDENTITY()语句执行前执行了其他的操作!利用存储过程是比较容易些,但是相对来说LZ你的这个情况不太适合