当前位置:编程学习 > C#/ASP.NET >>

如何取得刚刚插入的一条记录自增长ID

不用mssql的存储过程 --------------------编程问答-------------------- 那就select Max(id) --------------------编程问答-------------------- 是这样吗
insert 语句
加入之后再
select Max(id) --------------------编程问答--------------------
select @@Identity
--------------------编程问答--------------------

     string commandText = "insert into Posts(Category,Title,Detail)values(1,'11','22') select @@IDENTITY";
            int id = (int)SqlHelper.ExecuteScalar(CommandType.Text, commandText);
--------------------编程问答-------------------- 这样为什么不行 --------------------编程问答-------------------- insert into Posts(Category,Title,Detail)values(1,'11','22'); select @@IDENTITY --------------------编程问答--------------------  看看SQL语法先,别忘了分号 --------------------编程问答-------------------- int 新增ID = (int)数据表.Tables["表"].Rows[数据表.Tables["表"].Rows.Count - 1][0];
-----------------------------------------
癸巳〖蛇〗 丁巳月 壬寅日
 二〇一三年 四月   廿七|芒种
 双子座 庚申时  --------------------编程问答--------------------
引用 6 楼 q107770540 的回复:
insert into Posts(Category,Title,Detail)values(1,'11','22'); select @@IDENTITY
+1 --------------------编程问答-------------------- sqlserver这个比较好:SELECT SCOPE_IDENTITY() --------------------编程问答-------------------- 插入数据的同时,out出最大的ID --------------------编程问答--------------------
引用 9 楼 w_mojian180 的回复:
Quote: 引用 6 楼 q107770540 的回复:

insert into Posts(Category,Title,Detail)values(1,'11','22'); select @@IDENTITY
+1
++1 --------------------编程问答-------------------- 不用系统函数,用max可能会遇到并发的问题。当然,貌似也没有其他的好办法了。
MSSQL这个IDENTITY相当的讨厌。最恨在系统中遇到这种类型的主键。 --------------------编程问答--------------------
也可以 select top 1 ID from table1 order by ID desc 
--------------------编程问答-------------------- http://www.cnblogs.com/leotan/archive/2010/09/13/1825324.html 

SCOPE_IDENTITY --------------------编程问答-------------------- 你可以把ID作为一个双向的参数类型,这样,当你保存完以后,值会返回到你的程序中,直接就能得到。这样比较适合用存储过程,参数来处理。如果是sql,这个,一般的还容易处理,要是并发的情况下,就有点小麻烦,还是建议你用存储过程,然后参数来处理。 --------------------编程问答-------------------- 4楼正解,一直都是这么用的,感觉很好。 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
那就select Max(id)

可以  但是不好


引用 3 楼 q107770540 的回复:
select @@Identity

可以 很好 --------------------编程问答-------------------- 用到并发那就通过事务去空值!! --------------------编程问答-------------------- 又长见识了
--------------------编程问答-------------------- 解决了之前的困惑 --------------------编程问答-------------------- 获取刚刚插入的表的自增ID值:
有3个方法
1、select @@identity :返回当前会话的所有作用域中的任何表最后生成的标识值(全局的,如果你插入表a,又插入表b,此时返回b表的id)
2、select SCOPE_IDENTITY() :返回当前会话和当前作用域中的任何表最后生成的标识值 (是当前会话的,如果你插入表a,又插入表b,此时返回b表的id)
3、select ident_current(‘表名'):返回特定表最后生成的标识值 (不受作用域和会话的限制)
在实际应用中,使用第3种方式在并发比较大的时候,可能会造成问题,例如下面的代码:
insert into table1(xxx) values(xxx); select ident_current('table1');
上面这句sql,在并发用户很多的时候,很有可能返回的并不是刚刚插入的那个id,而有可能是其它线程插入的id(因为ident_current是跨所有会话的)


参考:http://beinet.cn/Blog/BlogShow.aspx?id=0ff6e08a-176e-48dc-9baf-f3c6daa4fa91
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,