在公司写的的项目里面,添加新数据的时候,经常要用到添加完之后要返回新数据的ID,于是就在insert后面加上了select SCOPE_IDENTITY()这句代码。
奇怪的是,有些表加上这句代码可以顺利返回ID,但另一些表却报:“该语句没有返回结果集。”
最神奇的是:之前一直能够正常返回ID的表,今天用着用着也突然间不能返回了,也报:“该语句没有返回结果集”这个异常了,这是怎么回事呢?
谢谢你。
奇怪的是,有些表加上这句代码可以顺利返回ID,但另一些表却报:“该语句没有返回结果集。”
最神奇的是:之前一直能够正常返回ID的表,今天用着用着也突然间不能返回了,也报:“该语句没有返回结果集”这个异常了,这是怎么回事呢?
谢谢你。
http://msdn.microsoft.com/zh-cn/library/ms190315.aspx
刚才我修改了一下代码,原来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就说不清楚了。
最好还是按你第一次写的那样做,select scope_identity() 是马上获得当前作用域insert语句里的最后标识值!
分开写时insert已经执行完!作用域应该不会返回结果。
你错误的效果应该如下例句:
Insert Into #tb values('1','1')
Select * from #tb
Select Scope_identity()
以你所用语句为例,在查询分析器(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)应该就可以了
我想了个偷懒的办法,就是把insert tableName values (xxxx, xxxx)这个语句,作为一个变量,然后在存储过程里面用exec来执行,这样我就只需要生成一个存储过程就可以了。结果,select scope_identity()的结果是null。也就是说,我这个办法行不通了。
请问有没有简单一些办法,用一个存储过程,就可以任何表在这个存储过程里面“insert ”的之后,都可以取出id呢?