为这个问题前前后后花了我260分,帮帮忙吧!!!!!!!!!!

skyhh 2004-04-09 03:22:25
怎样得到最新插入行的字段!
(不能是别人插入的,只能是自己插入的)

我现在是建了一个表做为我系统里的主表!
在系统里每执行一个操作就先会写在这个主表里!然后跟据写在这个表里的唯一标识,再写到其它附表里!(根据这个表里的唯一标识来关联)

可问题是,有个并发性,如果同时有很多人用的话,就怕取错了!
目地:得到插入在主表里的唯一标识!

打个比方吧!我开始在主表里插入了一行,唯一ID是100,正要取得刚插入的这行的唯一标识时!可另一个人,也向表里写了一行,唯一ID是101,所以到后来我取得的是101!

我用的是SQL2000
/////////////////////////////////////////////////////////////
数据库加个字段,把sessionid读进去,那肯定不会错了
SESSIONID当然不太可能有重复的了
===============================
但还是可能会有重复的呀!
//////////////////////////////////////////////////////////////
不建议用自增的字段,可以先生成id,再把id插进去。
===============================
你的这种方法是人工来干预的,不是很好,还有时间,也有可能会有重复的!
//////////////////////////////////////////////////////////////
插入一条带自动编号字段的记录后,获取该记录的bookmark属性值
===============================
1,3不支持bookmark属性,我也试了很多支持的会有
提供者不能确定该值。原因可能是:记录刚刚创建,该字段的默认值不可用,或用户未设置新值
//////////////////////////////////////////////////////////////
如果用 RecordSet.AddNew 插入记录,
RecordSet.Update 之后,它的指针就处于刚插入的记录上
===============================
指针是在最新的一条,可是读不出的是空值呀!
//////////////////////////////////////////////////////////////
如果你的id在主表中是自动增长id的话。插入记录后,可以用select @@identity来获得刚插入的记录的id号
===============================
先执行insert,再执行select @@identity,是能得到最大!但这是两条语句呀!可还是有可能在自己执行insert后,别人也执行了一条insert,这也不能保证是自己的ID呀!
//////////////////////////////////////////////////////////////


以上是坛子里一些高手+好人告诉我的!
你知道不知道呢!!??

想来想去,只有一种办法,在我操作的时候,锁表!!!!!!!!!!!!
(可我不知道,郁闷..........................................
...全文
29 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
moon1981911 2004-04-09
ding
回复
soso119 2004-04-09
難呀~幫你碩~
回复
skyhh 2004-04-09
lienzhu(李强)
和我想的一样!
能不能给个列子我!!!!!!!!!!!!
回复
lienzhu 2004-04-09
使用触发器
回复
skyhh 2004-04-09
qing205(君不见)
你这种是加一个标识然后再取他的ID,可是会这这种情况!
在插入到查询的过程中,会有相同标识的再插入一条!

这样,就不行了!
回复
cjf1009 2004-04-09
楼主的要求怎么这么高?有点钻牛角尖了啊!
还是支持可以先生成id,再把id插进去。
1、randomize
ranNum=int(90000*rnd)+10000
filename="A"&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum
插入的时候先判断是否有这个id,没有就再执行一次,类似的:
2、right(year(now),1)&month(now)&day(now)&right(replace(timer,".",""),5)
取得当前时间,精确到秒的,作为id;
3、我在你原来的帖子上写的,你可以把原来的帖子编号贴出来,我给你改改。
那个是先取出库里最大的,然后+1,总之,你在插入之前判断是不是存在相同id,可以用for循环+1,知道库里没有相同记录就执行插入。一般不会有问题的。
回复
qing205 2004-04-09
这样做
插入一条记录
字段是 ID(自动编号) BB CC
1230 输入的内容 你的session("name")

查询你插入的最后一条记录
user_name=session("name")
SqlCmd="Select top 1 * from table where cc='"&user_name&"' order by id desc"
set rs=conn.execute(sqlcmd)
回复
skyhh 2004-04-09
jiffer(李蕾):
sql="select top 1 * from table where username='你的名字' order by id desc"
rs.open sql,cn,1,1
Id=rs("id")
id就是最大的

我是插入后,马上得到它的自动ID!
像你这样,是在插入后,再打开一个数据集再得到它的ID,可谁知道,在打开这个得到ID的数据集时,有多少人会在这之前也执行插入!!!结果........
回复
jiffer 2004-04-09
sql="select top 1 * from table where username='你的名字' order by id desc"
rs.open sql,cn,1,1
Id=rs("id")
id就是最大的。
回复
skyhh 2004-04-09
luluso(luluso) :
我也试了!
先是在页面里用了application.lock但没有用application.unlock

然后再我的机器上执行了,得到了最后一条的唯一ID
这时我没用application.unlock的话,别人访问相同的页面就会报错吧!
可我在另一台用的时候,没有报错呀!也能得出最后一条的唯一ID
点解!!!

PPLUNCLE(.NET学习中-人是逼出来的!) :
并发,并发,并发,并发,并发,并发!!!
回复
PPLUNCLE 2004-04-09
select * from 表 where id=(select max(id) from 表)
回复
luluso 2004-04-09
application.lock
数据库的insert语句
application.unlock
保证不会在同一时间共同的插入!
回复
发动态
发帖子
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
社区公告
暂无公告