LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

ASP中获取正在插入的记录的ID值SQL语句和方法

admin
2010年12月13日 14:11 本文热度 3190


在ASP网站开发中,我们经常遇到,需要把新插入的记录的ID取出来,作为一个很重要的标识字段存到另一个表里。
    很傻的办法是,instert以后,把插入值作为条件取查询,但有时会出错,因为不唯一,也有人会想到,查询最大的那个ID“max(id)”,或者最顶上的那个ID,“select top1 id”,这些在单用户下是可以的,但在多用户操作时,很可能获取到时别人的ID。


   什么方法最有效呢?如何才能有效获取正在插入的记录的ID值SQL语句和方法?下面用一个例子来说明方法。现在这里有张gisblogs_net这样的表(创建代码如下,sql server)


create table gisblogs_net
(
     id int identify(1,1) primary key not null,
     name varchar(50) null
)


下面时ASP获取ID的代码


dim sql,conn
dbuid="sa"     
dbpwd="sa123456"      
dbname="gisblogs.net"   
dbip="localhost"
conn="driver={SQL Server};server="&dbip&";uid="&dbuid&";pwd="&dbpwd& amp;";database="&dbname&""(连接字符串,ACCESS自己找一个)
sql="select * from gisblogs_net"
rs.open sql,conn,1,3
rs.addnew
rs("name")="测试"
rs.update
response.Write(rs("id"))
rs.close
set rs=nothing
set conn=nothing


该文章在 2010/12/13 14:11:13 编辑过

全部评论8

admin
2010年12月13日 14:11
找到一句可以获得当前最新ID的语句,如下: 复制内容到剪贴板代码: conn.execute("insert into member (user,code) values ('"&request.form("user")&"','"&request.form("code")&"')") set rs=conn.execute("Select SCOPE_IDENTITY()") newsid=rs(0) rs.close试过,确实能获得最新ID,但是看了SCOPE_IDENTITY()相关介绍后还是有点不明白,语句中为什么写“newsid=rs(0)”,其中的rs(0)是什么意思?我更换成“newsid=rs(1)”、“newsid=rs”都是什么都没有。如果我想要获取的不是ID而是别的列又要怎样呢?

该评论在 2010/12/13 14:11:38 编辑过
admin
2010年12月13日 14:11
SCOPE_IDENTITY() SCOPE_IDENTITY()获取的是最后一个字段的id select scope_identity() rs(0) 是索引 一般的sql "select id,name from table" rs(0)=rs("id") rs(1)=rs("name")

该评论在 2010/12/13 14:11:49 编辑过
admin
2010年12月13日 14:12
rs(0)是第一个字段的值,Select SCOPE_IDENTITY() 所以没有rs(1)...

该评论在 2010/12/13 14:12:04 编辑过
admin
2010年12月13日 14:12
如果我想获取多几个最新值该怎么办? 像是在select scope_identity()之后,希望能获取最新的id 以及最新的name

该评论在 2010/12/13 14:12:28 编辑过
admin
2010年12月13日 14:12
那就查询了

该评论在 2010/12/13 14:12:42 编辑过
admin
2010年12月13日 14:12
意思是select scope_identity()只能查询到1个字段的值而不是一整行各个字段的值吗?

该评论在 2010/12/13 14:12:51 编辑过
admin
2010年12月13日 14:13
首先你应当先去了解什么是identity类型。 简单的说,这个类型是自增类型,所以只对整型类的数据有效。 再回过头来看你的方法:scope_identity,获取这种自增字段,那肯定就不可能把非自增类型的数据给索取出来了。 如果你还想把各个字段的值取出来,除了乖乖的检索表之外无其他办法。

该评论在 2010/12/13 14:13:13 编辑过
admin
2010年12月13日 14:14
对于sql server 2000来说,它提供了两个全新的函数(ident_current,scope_identity),并且改进了@@identity的不足.当你插入新记录后,可以调用函数:
print ident_current(table) 这将获得新的identity值,不管数据库中是不是有记录添加(这就避免了@@identity的连接限制)
或者:print scope_identity() 这将获得在当前存储过程,触发器等其他程序创建的最新记录的identity值.
而全局变量@@identity有一个问题,当对一张表执行insert时,如果该表有触发器程序在执行插入操作,然后,接着在另一张表中插入记录,这样返回@@identity值就是第二张表的identity值。
如果你用的不是sql server 2000,你最好一个简单的存储过程来解决这个问题。
create procedure myproc
@param1 int
as
begin
set nocount on
insert into sometable
(
intfield
)
values
(
@param1
)
set nocount off
select newid = @@identity
end
在asp中你可以这样做:
<%
fakevalue = 5
set conn = server.createobject("adodb.connection")
conn.open "<conn string>"
set rs = conn.execute("exec myproc @param1=" & fakevalue)
response.write "new id was " & rs(0)
rs.close: set rs = nothing
conn.close: set conn = nothing
%>

该评论在 2010/12/13 14:16:19 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved