怎样得到刚插入数据库的记录的主键id?

时间:2021-09-14 23:26:37
我知道可以用
  INSERT   INTO   userinfo   (pwd,   name)   VALUES   (@pwd,   @name)   SELECT   @@IDENTITY   AS   ID

来得到刚插入的数据的自动编码id,但是如果写成函数,在表现层我如何得到数据层这个值?我要如何把他作为参数再传到其他页面?

35 个解决方案

#1


再调下select max(id) from table

#2


作为函数返回值呀

#3


肯定是用存储过程把 @@identity作为返回值

#4


declare @Pass int
  insert into.............
  set
    @Pass = @@Identity
===========================
后台代码:
sqlparrimeter PASS= cmd.parrr.Add("@Pass",sqldaty.int);
PASS.Direction=ParrtesDirection.ReturnValue;

cmd.connection.close();
response.write(PASS.Value);//刚插入的id


#5


在存储过程中:

Insert into Users(UserName,UserPwd,InsertTime)
values(@UserName,@UserPwd,getdate())
select @Id = @@IDENTITY 
@Id就是刚插入的主键id

#6


Public Function AddData(ByVal ClassID As Integer, ByVal Name As String, ByVal Content As String, ByVal ImgUrlBig As String, ByVal ImgUrlSml As String, ByVal IsShow As Boolean) As Integer
            Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow) SELECT @@IDENTITY AS 'ID'"
            conn.Open()
            Cmd = New OleDbCommand(Access, conn)
            Cmd.Parameters.Add("@ClassID", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("@Content", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("@ImgUrlBig", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("@ImgUrlSml", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("@IsShow", OleDbType.Boolean).Value = IsShow
            Dim ID As Integer
            Try
                ID = Int(Convert.ToInt32(Cmd.ExecuteScalar))
                conn.Close()
                Return ID
            Catch ex As Exception
            End Try
        End Function


ACCESS数据库来的。 这样返回是0.。。。哪里错了?

#7


up

#8


up

#9


路过~~

#10


急啊。。帮帮我。

#11


1。
Access 数据库?

2。
Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow) SELECT @@IDENTITY AS 'ID'"
——————————————————
Access 不支持批处理吧,只能一条条的来

3。
试试这样子:

sqlIns = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (?, ?, ?, ?, ?, ?)"
sqlSel = "select MAX(ProductID) from Product_Info"

' 事务开始
            conn.Open()
            Cmd = New OleDbCommand(sqlIns, conn)
            Cmd.Parameters.Add("", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("", OleDbType.Boolean).Value = IsShow
            ' 执行插入
            Cmd.ExecuteNonQuery

            Cmd.CommandText = sqlSel
            Dim scalar as Object
            ' 读取刚插入的 ID 
            scalar = Cmd.ExecuteScalar
' 事务结束

'注意,这里需要显示开启事务,否则,你可能读到别人添加的数据
'我不熟悉 VB 语法,就不写事务了

4。
对于 OleDb , 不支持命令参数(如@ClassID这种), 只能使用占位符(用 ? 表示),并且按顺序匹配,因为 OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致


Hope helpful!

#12


因为 OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致

》》》

因此, OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致

#13


1. 是access数据库
2. Access 支持批处理
3.因为只是一个人操作数据库,所以可以不用事务。
4.OleDb , 不支持命令参数(如@ClassID这种)  这个不明白你的意思。 我用这样的在acess是可以的。

#14


@@identity  这个是执行 插入操作才好用的返回插出的ID号 也就是最大ID

在AC中好不好用还真不知道。。用 max(id)吧

#15


max(id) 是读出最大id那整条记录吗?
我刚用max试了。返回来怎么老说id不是表中的字段?

#16


终于搞定了。谢谢:Jinglecat(晓风残月) 
        Public Function AddData(ByVal ClassID As Integer, ByVal Name As String, ByVal Content As String, ByVal ImgUrlBig As String, ByVal ImgUrlSml As String, ByVal IsShow As Boolean) As Object
            Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow)"
            Dim AccessSel As String
            AccessSel = "select MAX(ID) from Product_Info"
            conn.Open()
            Cmd = New OleDbCommand(Access, conn)
            Cmd.Parameters.Add("@ClassID", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("@Content", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("@ImgUrlBig", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("@ImgUrlSml", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("@IsShow", OleDbType.Boolean).Value = IsShow
            Cmd.ExecuteNonQuery()
            Cmd.CommandText = AccessSel
            Dim scalar As Object
            scalar = Cmd.ExecuteScalar
            conn.Close()
            Return scalar
        End Function

另外我把这个ID存入interg变量中,在Response.Write中要如何把这个ID做为参数传出去?
Response.Write("<a href='addmore.aspx?id=id'>添加更多图片</a>")

#17


INSERT   INTO   userinfo   (pwd,   name)   VALUES   (@pwd,   @name)

//

SELECT top 1 id from userinfo order by id desc

#18


http://blog.joycode.com/ghj/archive/2004/03/21/16745.aspx
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较

#19


在存储过程中:

Insert into Users(UserName,UserPwd,InsertTime)
values(@UserName,@UserPwd,getdate())
select @Id = @@IDENTITY 
@Id就是刚插入的主键id

--------------------------------
高效、稳定、双线(电信、网通)任选择,提供预先免费测试3天。
http://www.dataweb.cn
QQ:42836192

#20




lz考虑到并发性问题了么?


总感觉没用事务,不是很放心


#21


up

#22


如果是SQL的话,最简单,在触发器里解决。
select @@Identity
好像这样就可以了。
用insert ..直接返回记录集
就能得到了

#23


学习!

#24


up

#25


收藏!!!

#26


出参

#27


mark

#28


学习

#29


@@identity

#30


用存储过程可以咯

#31


应该使用 SCOPE_IDENTITY, 而不是@@identity

SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 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 值。

#32


如果插入主键的编号不是自动递增的 而是随机生成的Nvarchar型 
如何返回主键 谢谢

#33


你的nvarchar主见是你自己插入进去的,这个值还有必要返回吗?

#34


查询最大id。当然为了避免并发,要使用线程同步

#35


要是插入id不是int类型呢.是文本类型的.比如说是:XFGUID:uniqueidentifier

#1


再调下select max(id) from table

#2


作为函数返回值呀

#3


肯定是用存储过程把 @@identity作为返回值

#4


declare @Pass int
  insert into.............
  set
    @Pass = @@Identity
===========================
后台代码:
sqlparrimeter PASS= cmd.parrr.Add("@Pass",sqldaty.int);
PASS.Direction=ParrtesDirection.ReturnValue;

cmd.connection.close();
response.write(PASS.Value);//刚插入的id


#5


在存储过程中:

Insert into Users(UserName,UserPwd,InsertTime)
values(@UserName,@UserPwd,getdate())
select @Id = @@IDENTITY 
@Id就是刚插入的主键id

#6


Public Function AddData(ByVal ClassID As Integer, ByVal Name As String, ByVal Content As String, ByVal ImgUrlBig As String, ByVal ImgUrlSml As String, ByVal IsShow As Boolean) As Integer
            Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow) SELECT @@IDENTITY AS 'ID'"
            conn.Open()
            Cmd = New OleDbCommand(Access, conn)
            Cmd.Parameters.Add("@ClassID", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("@Content", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("@ImgUrlBig", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("@ImgUrlSml", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("@IsShow", OleDbType.Boolean).Value = IsShow
            Dim ID As Integer
            Try
                ID = Int(Convert.ToInt32(Cmd.ExecuteScalar))
                conn.Close()
                Return ID
            Catch ex As Exception
            End Try
        End Function


ACCESS数据库来的。 这样返回是0.。。。哪里错了?

#7


up

#8


up

#9


路过~~

#10


急啊。。帮帮我。

#11


1。
Access 数据库?

2。
Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow) SELECT @@IDENTITY AS 'ID'"
——————————————————
Access 不支持批处理吧,只能一条条的来

3。
试试这样子:

sqlIns = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (?, ?, ?, ?, ?, ?)"
sqlSel = "select MAX(ProductID) from Product_Info"

' 事务开始
            conn.Open()
            Cmd = New OleDbCommand(sqlIns, conn)
            Cmd.Parameters.Add("", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("", OleDbType.Boolean).Value = IsShow
            ' 执行插入
            Cmd.ExecuteNonQuery

            Cmd.CommandText = sqlSel
            Dim scalar as Object
            ' 读取刚插入的 ID 
            scalar = Cmd.ExecuteScalar
' 事务结束

'注意,这里需要显示开启事务,否则,你可能读到别人添加的数据
'我不熟悉 VB 语法,就不写事务了

4。
对于 OleDb , 不支持命令参数(如@ClassID这种), 只能使用占位符(用 ? 表示),并且按顺序匹配,因为 OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致


Hope helpful!

#12


因为 OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致

》》》

因此, OleDbCommand.Parameters 的添加顺序要与你 SQL 的顺序一致

#13


1. 是access数据库
2. Access 支持批处理
3.因为只是一个人操作数据库,所以可以不用事务。
4.OleDb , 不支持命令参数(如@ClassID这种)  这个不明白你的意思。 我用这样的在acess是可以的。

#14


@@identity  这个是执行 插入操作才好用的返回插出的ID号 也就是最大ID

在AC中好不好用还真不知道。。用 max(id)吧

#15


max(id) 是读出最大id那整条记录吗?
我刚用max试了。返回来怎么老说id不是表中的字段?

#16


终于搞定了。谢谢:Jinglecat(晓风残月) 
        Public Function AddData(ByVal ClassID As Integer, ByVal Name As String, ByVal Content As String, ByVal ImgUrlBig As String, ByVal ImgUrlSml As String, ByVal IsShow As Boolean) As Object
            Access = "insert into Product_Info (ClassID, Name, Content, ImgUrlBig, ImgUrlSml, IsShow) values (@ClassID, @Name, @Content, @ImgUrlBig, @ImgUrlSml, @IsShow)"
            Dim AccessSel As String
            AccessSel = "select MAX(ID) from Product_Info"
            conn.Open()
            Cmd = New OleDbCommand(Access, conn)
            Cmd.Parameters.Add("@ClassID", OleDbType.Integer).Value = ClassID
            Cmd.Parameters.Add("@Name", OleDbType.VarChar).Value = Name
            Cmd.Parameters.Add("@Content", OleDbType.VarChar).Value = Content
            Cmd.Parameters.Add("@ImgUrlBig", OleDbType.VarChar).Value = ImgUrlBig
            Cmd.Parameters.Add("@ImgUrlSml", OleDbType.VarChar).Value = ImgUrlSml
            Cmd.Parameters.Add("@IsShow", OleDbType.Boolean).Value = IsShow
            Cmd.ExecuteNonQuery()
            Cmd.CommandText = AccessSel
            Dim scalar As Object
            scalar = Cmd.ExecuteScalar
            conn.Close()
            Return scalar
        End Function

另外我把这个ID存入interg变量中,在Response.Write中要如何把这个ID做为参数传出去?
Response.Write("<a href='addmore.aspx?id=id'>添加更多图片</a>")

#17


INSERT   INTO   userinfo   (pwd,   name)   VALUES   (@pwd,   @name)

//

SELECT top 1 id from userinfo order by id desc

#18


http://blog.joycode.com/ghj/archive/2004/03/21/16745.aspx
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY的比较

#19


在存储过程中:

Insert into Users(UserName,UserPwd,InsertTime)
values(@UserName,@UserPwd,getdate())
select @Id = @@IDENTITY 
@Id就是刚插入的主键id

--------------------------------
高效、稳定、双线(电信、网通)任选择,提供预先免费测试3天。
http://www.dataweb.cn
QQ:42836192

#20




lz考虑到并发性问题了么?


总感觉没用事务,不是很放心


#21


up

#22


如果是SQL的话,最简单,在触发器里解决。
select @@Identity
好像这样就可以了。
用insert ..直接返回记录集
就能得到了

#23


学习!

#24


up

#25


收藏!!!

#26


出参

#27


mark

#28


学习

#29


@@identity

#30


用存储过程可以咯

#31


应该使用 SCOPE_IDENTITY, 而不是@@identity

SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 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 值。

#32


如果插入主键的编号不是自动递增的 而是随机生成的Nvarchar型 
如何返回主键 谢谢

#33


你的nvarchar主见是你自己插入进去的,这个值还有必要返回吗?

#34


查询最大id。当然为了避免并发,要使用线程同步

#35


要是插入id不是int类型呢.是文本类型的.比如说是:XFGUID:uniqueidentifier