如何方便的知道插入到数据库中的新记录的ID号?

时间:2021-02-28 21:47:49
我现在提这样做的
sql="select top 0 * from [online]"
rs.open sql,conn,1,3
rs.addnew
rs("数据")="数据"
rs("数据")="数据"
rs.update
session("ID")=rs("id")
rs.close

这样做起来的效率高吗?有没有更好的办法?

16 个解决方案

#1


我的做法跟你的一样啊!

#2


这样是查询第一条记录的ID号~不是最新的吧

#3


最好用SQL语句

set rs=conn.execute("insert into mytable(id,name) values(1,'killy')")

#4


效率不高,最好用如下方法:

最好用SQL语句

conn.execute("insert into mytable(id,name) values(1,'killy')")

#5


对啊,你那样做只是修改了吧

#6


select  @@identity  as id

#7


楼主这样作其实不完全正确的!
假如有两个人(甲乙)同时操作,甲在添加数据的时候乙也在作,甲的环境稍微差些,乙先作完了,
这个时候,甲得到的ID值就会是乙的ID值,当然,乙这时候得到的是自己的ID值!

这只是两个人的情况,如果有多个人在同时操作,就乱了!!
aspczlover(执子之手...) 的方法是否可行我还不知道呢!个人感觉应该写个存储过程!

#8


调用这个存储过程进行插入,并且返回插入的数据的ID值

#9


效率低一点没关系,可别出错啊?有权威一下吗? 我感觉sunjiujiu(窝头太少了)的情况不出出现吧!就算更新了RS执行了一下UPDATE,rs的指针仍然指向当前新插入的记录的,怎么会跑到别的记录上去呢?

#10


自己顶一下

#11


还行.

#12


自己插入的这条记录直接先写进去rs.update

楼主这类写法好象和这个没有区别
session("id")=rs.recordcount
就是最新的记录吧?

#13


效率低一点没关系,别出错就可以了。

#14


to bye9bye
    rs.recordcount是总记录数吧,再说了,为什么要写进session,你理解错我的意思了

#15


用储存过程,这样的话,在储存过程中同时加入事务处理,不论什么情况,只有先执行储存过各的那个得到数据库中最后的ID,且新ID用最大ID加1的方式进行,这样可以保证不会有任何错误出现!

#16


SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

语法
SCOPE_IDENTITY( )

返回类型
sql_variant

注释
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中的值。 

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关更多信息,请参见 IDENT_CURRENT。

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 值。

#1


我的做法跟你的一样啊!

#2


这样是查询第一条记录的ID号~不是最新的吧

#3


最好用SQL语句

set rs=conn.execute("insert into mytable(id,name) values(1,'killy')")

#4


效率不高,最好用如下方法:

最好用SQL语句

conn.execute("insert into mytable(id,name) values(1,'killy')")

#5


对啊,你那样做只是修改了吧

#6


select  @@identity  as id

#7


楼主这样作其实不完全正确的!
假如有两个人(甲乙)同时操作,甲在添加数据的时候乙也在作,甲的环境稍微差些,乙先作完了,
这个时候,甲得到的ID值就会是乙的ID值,当然,乙这时候得到的是自己的ID值!

这只是两个人的情况,如果有多个人在同时操作,就乱了!!
aspczlover(执子之手...) 的方法是否可行我还不知道呢!个人感觉应该写个存储过程!

#8


调用这个存储过程进行插入,并且返回插入的数据的ID值

#9


效率低一点没关系,可别出错啊?有权威一下吗? 我感觉sunjiujiu(窝头太少了)的情况不出出现吧!就算更新了RS执行了一下UPDATE,rs的指针仍然指向当前新插入的记录的,怎么会跑到别的记录上去呢?

#10


自己顶一下

#11


还行.

#12


自己插入的这条记录直接先写进去rs.update

楼主这类写法好象和这个没有区别
session("id")=rs.recordcount
就是最新的记录吧?

#13


效率低一点没关系,别出错就可以了。

#14


to bye9bye
    rs.recordcount是总记录数吧,再说了,为什么要写进session,你理解错我的意思了

#15


用储存过程,这样的话,在储存过程中同时加入事务处理,不论什么情况,只有先执行储存过各的那个得到数据库中最后的ID,且新ID用最大ID加1的方式进行,这样可以保证不会有任何错误出现!

#16


SCOPE_IDENTITY
返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

语法
SCOPE_IDENTITY( )

返回类型
sql_variant

注释
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,因为它们都返回插入到 IDENTITY 列中的值。 

IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。有关更多信息,请参见 IDENT_CURRENT。

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 值。