Sql server 2008 &引用;事务不能有多个具有此游标类型的记录集。”;错误

Sql server 2008 &引用;事务不能有多个具有此游标类型的记录集。”;错误,sql-server-2008,asp-classic,recordset,cursor-position,Sql Server 2008,Asp Classic,Recordset,Cursor Position,我的经典asp应用程序中出现以下错误: 用于ODBC驱动程序的Microsoft OLE DB提供程序错误“80004005” 事务不能有多个具有此游标类型的记录集。 更改游标类型、提交事务或关闭其中一个 记录集 我正在将代码从Oracle迁移到SQL Server 2008,这是我在整个应用程序中经常看到的问题 似乎找不到任何修复方法 这段代码中的这种特殊情况:(我更改了选择以使其更短) Set MyConn=Server.CreateObject(“ADODB.Connection”) 调用

我的经典asp应用程序中出现以下错误:

用于ODBC驱动程序的Microsoft OLE DB提供程序错误“80004005”

事务不能有多个具有此游标类型的记录集。 更改游标类型、提交事务或关闭其中一个 记录集

我正在将代码从Oracle迁移到SQL Server 2008,这是我在整个应用程序中经常看到的问题

似乎找不到任何修复方法

这段代码中的这种特殊情况:(我更改了选择以使其更短)

Set MyConn=Server.CreateObject(“ADODB.Connection”)
调用OpenORPSConnect(MyConn)
ql=“从mytable中选择用户名”
设置rs=MyConn.Execute(sql)
如果不是rs.EOF,则用户名=rs(0)
如果username=”“,则username=theUser
rs.close()
设置rs=无
MyConn.beginters()
sql=“从MyTable中选择someReport”
设置rs=MyConn.Execute(sql)
做而不做
时间戳=rs(“时间戳”)
rev=卢比(“rev”)
选择case whatChange
案例“目标日期”
sql=“插入”&caJustTable&_
“(文本、时间戳、CURRENTFLAG)”和_
“值(文本&“,”&复制&“,”Y')”
MyConn.Execute(sql)
结束选择
sql=“更新表格,将此设置为该”

MyConn.Execute(sql)我认为MyConn最终可能需要关闭。这是您可以尝试的吗???

您在连接上已经有一个打开的记录集,因此我认为问题在于,在记录集关闭之前,您的数据库不支持在同一连接上执行其他操作。作为解决方案,我推荐以下三种选择之一:

  • 使用第二个连接(在其上运行事务)来运行更新表的sql语句

  • 在循环遍历记录集时,将所有语句收集到一个列表中,关闭记录集,然后运行语句(使用相同的连接)

  • 或者将数据拉入一个数据表,并在其中循环,而不是打开一个记录集


  • 因为这在评论中得到了回答,我想把它变成一个更好的答案

    您的问题似乎是所选案例中Insert语句后的
    MyConn.BeginTrans()
    没有
    MyConn.CommitTrans()
    MyConn.RollbackTrans()
    ;因此,当您尝试更新数据时会引发错误。如果在插入执行之后提交或回滚,那么下一次执行应该可以正常工作。MyCON.NEXTIN()的事实在一个简单的SELECT语句之前,您可以考虑在SELECT之后移动它。p> 我会这样做(如果您想使用事务):

    'MyConn.beginters()
    sql=“从MyTable中选择someReport”
    设置rs=MyConn.Execute(sql)
    做而不做
    时间戳=rs(“时间戳”)
    rev=卢比(“rev”)
    选择case whatChange
    案例“目标日期”
    MyConn.beginters()
    sql=“插入”&caJustTable&_
    “(文本、时间戳、CURRENTFLAG)”和_
    “值(文本&“,”&复制&“,”Y')”
    MyConn.Execute(sql)
    MyConn.CommitTrans()'您需要在提交之前正确验证数据插入
    结束选择
    MyConn.beginters()
    sql=“更新表格,将此设置为该”
    
    MyConn.Execute(sql)我认为您的问题在于MyConn.beginters()在第一次执行后没有提交。如果你提交了它,那么你的下一个执行程序就可以正常工作了,或者你可以考虑在事务之外移动选择,不需要在那里进行。“罗伯特,我该把它放在哪里?”老实说,我甚至不知道为什么Beginters会出现在那里…如果你想的话,你可以把它移除。在插入失败的情况下,您可以回滚,而不会丢失现有数据。-SQL Server中有一个回滚选项。-MyConn.rollbacktrans事务对于确保所有(或没有)编辑都发生不重要吗?它是在我在这里显示的代码块之后使用的。。。。这也是一个“include”文件,“conn”作为变量传入…如果我关闭它,它现在可能与其他include一起工作。另一个可能的问题是,您使用同一个MyConn执行两个单独的sql语句,一个在while循环内部,一个在while循环外部-尝试使用不同的connections.hm。奇怪的是。。。当我使用调试器时,我没有得到错误。但是如果我在没有调试器的情况下做同样的事情,我会崩溃。。。。可能是时间问题吗?当我慢慢地浏览代码时,它在哪里有时间处理?
    Set MyConn  = Server.CreateObject("ADODB.Connection") 
    Call OpenORPSConnect(MyConn)
    ql = "Select username from mytable"
    set rs = MyConn.Execute(sql)
    if not rs.EOF then username = rs(0)
    if username = "" then username = theUser
    rs.close()
    set rs = nothing
    
    MyConn.BeginTrans()
    
    sql = "Select someReport from MyTable"
    set rs = MyConn.Execute(sql)
    
    do while not rs.EOF
    TIMESTAMP       = rs("TIMESTAMP")
    rev      = rs("REV")
    
    select case whatChange
        case "Target date"
           sql = "Insert into " & caJustTable & _
                     " (TEXT, TIMESTAMP, CURRENTFLAG)" & _
                " Values ( Text& "','" & COPY_TS & "', 'Y')""
    MyConn.Execute(sql) 
        end select
    
    sql = "update table, set this to that"
    MyConn.Execute(sql) <-------- error happens here sometimes....
    
    end if
    rs.movenext
    loop
    
    rs.close()
    set rs = nothing
    
    'MyConn.BeginTrans()
    
    sql = "Select someReport from MyTable"
    set rs = MyConn.Execute(sql)
    
    do while not rs.EOF
       TIMESTAMP = rs("TIMESTAMP")
       rev = rs("REV")
    
      select case whatChange
        case "Target date"
            MyConn.BeginTrans()
            sql = "Insert into " & caJustTable & _
                     " (TEXT, TIMESTAMP, CURRENTFLAG)" & _
                " Values ( Text& "','" & COPY_TS & "', 'Y')""
            MyConn.Execute(sql) 
            MyConn.CommitTrans() 'You'll want to validate your data inserts properly before committing
        end select
    
        MyConn.BeginTrans()
        sql = "update table, set this to that"
        MyConn.Execute(sql) <-------- error happens here sometimes....
        MyConn.CommitTrans()'You'll want to validate your data inserts properly before committing
    
      end if
      rs.movenext
    loop
    
    rs.close()
    set rs = nothing