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")
Update tabID Set IDofTest = @intNewID
COMMIT TRANSACTION
select @intNewID as NewID
^^^^^^^^^^^^^^^^^^^^^^^^^
BEGIN TRANSACTION
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabTest
Insert Into tabTest(IDofTest,Test1,Test2) Values(@intNewID,"HaHa","HeHe")
Update tabID Set IDofTest = @intNewID
COMMIT TRANSACTION
select @intNewID as NewID
^^^^^^^^^^^^^^^^^^^^^^^^^
如何才能在ASP中将最后的那一句的结果取回来呢?请指教一二,谢谢!
^^^^^^^
在前台用ado的parameter
<%
set conn=server.createobject("adodb.connection")
driver="{Microsoft Access Driver (*.mdb)}"
dbq=Server.MapPath("data\db\yfms.mdb")
conn.open "driver="&driver&";dbq="&dbq
sql="delete from phonebook"
conn.execute sql
%><%
set conn=server.createobject("adodb.connection")
driver="{Microsoft Access Driver (*.mdb)}"
dbq=Server.MapPath("data\db\yfms.mdb")
conn.open "driver="&driver&";dbq="&dbq
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')" &
"Update tabID Set IDofTest = @intNewID" &
"COMMIT TRANSACTION" &
"select @intNewID as NewID"conn.execute sql
%>
然后你访问这个记录集中唯一的字段NewID,唯一的记录.
语句如下: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) '--换了执行这一句程序还是报错数据库是Sql Server 2000,不不兄呀,你在Access中执行成功了吗?能在Sql server中试试吗?上帝呀,救救我吧!(俨然是傻吕布第二!!)
BEGIN TRANSACTION
Declare @intNewID Integer
Select @intNewID = Max(IDofTest) + 1 From tabID WITH (TABLOCKX)
Insert Into tabTest (IDofTest,Test1,Test2) Values(@intNewID,'HaHa','HeHe')
Update tabID Set IDofTest = @intNewID
COMMIT TRANSACTION
Select @intNewID As newID
如果正常,也应该能在asp中写入并由SQL执行。也许是你的asp处理记录集的方法有问题。
Set selfRs = Conn.Execute(strSql).NextRecordset.NextRecordset
Response.Write(selfRs("newID")) '--得到了正确的newID
如果不是MultiRecordset,那Conn.Execute(strSql).NextRecordset.NextRecordset如何解释?
当然,我也不能肯定以上的结论,因为在程序中出现了如下错误:
Set selfRs = Conn.Execute(strSql)
If Not selfRs.EOF Then '--出错了!!
........
End If
我胡涂了,这里的selfRS到底是个什么东西呢?还有一个比较麻烦的问题,就是如果使用NextRecordset方法,就必须知道所要执行的语句块中有多少select、insert、update以决定使用多少次nextRecordset,程序就会很受限制了!
Select @intNewID = Max(IDofTest) + 1 From tabID WITH (TABLOCKX)
是不返回数据集的, 只有一个数据集是肯定的(难道我真的错了?). 我在CB/Delphi中就这样做.你用select 123 As newID有没有同样的错?估计问题出在ASP中. 建议你到ASP版中问问.
看了资料,知道了一点,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了。
或者使用Set NoCount On和Set NoCount Off 来限制Update、Insert返回空记录集。
加分啦!