在ASP中如何取得Insert语句中的ID?

abent 2001-06-27 11:40:55
加精
有两张表:
tabID:只有一行一列,记录了目前最大的IDofTest
tabTest:需要操作的表,有IDofTest,Test1,Test2三列
现向tabTest中插入一条记录,语句如下:
SET XACT_ABORT ON
BEGIN TRANSACTION
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabTest
Insert Into tabTest(IDofTest,Test1,Test2) Values(@intNewID,"HaHa","HeHe")
COMMIT TRANSACTION

在ASP中执行完以上语句后如何可以正确的得到刚插入的记录的IDofTest?

如果在执行完插入后再执行一条Select IDofTest From tabID来取得是肯定不行的,因为并发性不好。
如果使用ASP的Command也不是特别好。
请问各位大虾,还有没有更爽的办法?谢谢赐教!!!
...全文
458 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
abent 2001-07-05
  • 打赏
  • 举报
回复
看了资料,知道了一点,Insert,Update返回的是空Recordset,所以会出现上面的情况。
而如何得到刚刚Insert的记录的ID值问题,解决方法如下:
strSql = "Set XAct_Abort On
Begin Transaction
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabID --这一句是变量赋值,没有返回
Select MaxID = @intNewID
^^^^^^^^^^^^^^^^^^^^^^^^
Insert Into tabTest(IDofTest,Test1,Test2) Values(@intNewID,'hehe','haha')
Update tabID Set IDofTest = @intNewID
Commit Transaction"
Set selfRs = Conn.Execute(strSql)
Response.Write (selfRs("MaxID")) '--最近插入的ID值
因为“Select MaxID = @intNewID”这一句之前没有哪一句有结果集,所以第一个结果集肯定就是MaxID,这样就不用去猜测第几个Recordset是MaxID了。

只是资料中有一点没有讲明白:“NextRecordset方法首先将Recordset自身清除再提前得到下一语句的结果集”,什么叫“提前得到”呀?具体是怎样一个过程呢?还请各位高手指教!!
AnnyBJ 2001-07-04
  • 打赏
  • 举报
回复
notice1
sugar 2001-07-04
  • 打赏
  • 举报
回复
strSql="Insert Into tablename(ID,Name,Caption) (SELECT isnull(max(ID)+1,1),'xxxxx','xxxxx' FROM tablename);" & vbCrLf
strSql=strSql & "select max(ID) as MAXID from tablename"

Set objRs = conn.Execute(strSql).NextRecordset

分号后面一定要回车!如果ID为自增型你就不能手动更新!
sugar 2001-07-04
  • 打赏
  • 举报
回复
你数据库里面的那个ID字段是自增型的吗,如果是,那插入时你不能更新它,系统会加的。
abent 2001-07-04
  • 打赏
  • 举报
回复
大禹兄的方法中的sql语句出错呀,能不能再麻烦一下,把你的sql语句写在一起,并在sql server + Asp中试验成功了再指导一下小弟,万分感激,也好让我给你们加分呀!
abent 2001-07-04
  • 打赏
  • 举报
回复
看到各位大虾鼎立相助,我木头也不敢偷懒,这不,连我的眼镜也熊猫眼了,可是......
语句如下:

strSql = "SET XACT_ABORT ON
BEGIN TRANSACTION
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabID
Insert Into tabTest(IDofTest,Test1,Test2) Values(@intNewID,'HaHa','HeHe')
Update tabID Set IDofTest = @intNewID
COMMIT TRANSACTION
Select @intNewID As newID"
Set selfRs = selfConn.Execute(strSql)

Response.Write(selfRs("newID")) ---程序报错
Response.Write(selfRs.NextRecordset("newID").value) --程序还是报错

上帝呀,救救我吧!(俨然是吕布第二!!)
abent 2001-07-04
  • 打赏
  • 举报
回复
你的方法可以,虽然不能完全满足我的要求,因为如果我在Insert语句和select语句之中加上Update语句,你的做法就不可行了,而要使用:
conn.Execute(strSql).NextRecordset.NextRecordset
说明Insert、Update、Select(处理给变量赋值的Select语句)都返回recordset!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是我还不能肯定以上的说法对不对,因为在执行以下语句时出错:
Set selfRs = conn.Execute(strSql) '--取到的应该是执行Insert语句得到的Recordset
If Not selfRs.EOF Then '--出错了
.....
End If

搞得我莫名其妙,因为不可能selfRs.NextRecordset(证明selfRs是一个Recordset)和selfRs.EOF错误(说明selfRs不是一个Recordset??)一起出现呀?
是不是某些Recordset没有EOF属性或者selfRs不是一个Recordset而是其他的东东,那究竟是什么呢?

第一次加分开始,请各位在此回答问题的朋友到加分贴去,回答以上问题的将再开贴加分!!
sugar 2001-07-03
  • 打赏
  • 举报
回复
objRsCheck===>objRs
sugar 2001-07-03
  • 打赏
  • 举报
回复
to abent(阿木一头):
这个保证能解决问题,sql语句执行两下,想当初摸索的过程,唉。。。。
兄弟们,我们共享一把!!!
strSql = "Insert Into maxidfield,field1,field2...." & vbCrLf

strSql = strSql & "(" _
& "SELECT max(ID),field1value,fieldvalue2...." _
& "FROM ...);" & vbCrLf

strSql = strSql & "select max(ID) as MAXID from ..." & vbCrLf

Set objRs = conn.Execute(strSql).NextRecordset
If Not objRsCheck.EOF Then
intMaxID = objRsCheck("MAXID").Value
' intMaxID = intMaxID + 1
End If
abent 2001-07-03
  • 打赏
  • 举报
回复
而实际情况是这几句话并不在存储过程里面,因为类似的情况在程序中太多太多,不可能每个都写成存储过程,这时该怎么办?
fish365 2001-07-02
  • 打赏
  • 举报
回复
你执行的实际上是个存贮过程,
让存贮过程返回IDofTest,
在asp中用ado执行这个存贮过程,结果返回到recordset中即可!
比如:
....
strsql = "exec spname sp_var"
set rs = conn.execute(strsql)
..
aspvar = rs(0)


abent 2001-07-02
  • 打赏
  • 举报
回复
我正在一分分的加分,真的很希望能用150分完美解决这个问题,这里分额不够,将另开贴加分,反悔是王八蛋!!!!!我的分也很充足(可用分2054,参与分680),保证供应!!!!
abent 2001-07-02
  • 打赏
  • 举报
回复
是不会有错误,但是如何用ASP将IDofTest取到ASP中的某一个变量中呢?因为事务完成了之后,锁就解开了。
fish365 2001-07-01
  • 打赏
  • 举报
回复
在你的sql语句里已经做了事务(它会锁住表)
所以你不必担心这个错误!
hydnoahark 2001-07-01
  • 打赏
  • 举报
回复
>>小弟既然使用@intNewID,也就是想控制ID,而不是使用标识列
既然是自己设定的ID,怎么会自己不知道???
abent 2001-07-01
  • 打赏
  • 举报
回复
再加一分,我真的很希望能搞懂这个问题,再请大家帮帮忙吧!谢谢了!
abent 2001-06-30
  • 打赏
  • 举报
回复
再加一分,请各位帮帮忙,谢谢了!
pgcat 2001-06-29
  • 打赏
  • 举报
回复
如果在asp中使用adodb能不能用这个方法?
hehongyu2000 2001-06-29
  • 打赏
  • 举报
回复
你的SQL语句明明是在stored proecedure中的sql语句
SET XACT_ABORT ON
BEGIN TRANSACTION
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabTest
Insert Into tabTest(IDofTest,Test1,Test2) Values(@intNewID,"HaHa","HeHe")
COMMIT TRANSACTION

你只须在commit ransaction前加一句SELECT @@IDENTITY就可以了.
abent 2001-06-29
  • 打赏
  • 举报
回复
小马:
你说的我很心虚耶!是的呀,有什么不妥吗?
加载更多回复(8)

28,390

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧