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
^^^^^^^^^^^^^^^^^^^^^^^^^

解决方案 »

  1.   

    不兄:
    如何才能在ASP中将最后的那一句的结果取回来呢?请指教一二,谢谢!
           ^^^^^^^
      

  2.   

    用输出参数。
    在前台用ado的parameter
      

  3.   

    在你前端建立一个记录集, 其对应的SQL语句就是上面全部.
      

  4.   

    那如何用ASP取到这个记录集中IDofTest,因为这个时候返回的已经是多记录集了,我如何定位到包含IDofTest的记录集呢?
      

  5.   

    大致如下吧:
    <%
    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,唯一的记录.
      

  6.   

    看到各位大虾鼎立相助,我木头也不敢偷懒,这不,连我的眼镜也熊猫眼了,可是......
    语句如下: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中试试吗?上帝呀,救救我吧!(俨然是傻吕布第二!!)
      

  7.   

    这个SQL恐怕不能在Access中执行。我上面的那个ASP是照猫画虎的。你把SQL换成这样调试你的ASP程序:select 123 As newID如果这样成功,在SQL Query Analyzer 中测试下面的SQL,看看是不是有一个单记录单行的记录集:SET XACT_ABORT ON
    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处理记录集的方法有问题。
      

  8.   

    不不兄,我试了一下,发现以上的Sql语句可能确实返回了一个MultiRecordset,因为我用如下语句取到了newID:
    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,程序就会很受限制了!
      

  9.   

    语句:
    Select @intNewID = Max(IDofTest) + 1 From tabID WITH (TABLOCKX)
    是不返回数据集的, 只有一个数据集是肯定的(难道我真的错了?). 我在CB/Delphi中就这样做.你用select 123 As newID有没有同样的错?估计问题出在ASP中. 建议你到ASP版中问问.
      

  10.   

    谢谢不不兄和其他的同志了,问题已经解决:
    看了资料,知道了一点,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返回空记录集。
    加分啦!