0

我在经典的 asp 应用程序中收到以下错误:

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

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

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

似乎找不到任何修复它。

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

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
4

3 回答 3

1

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

您的问题似乎是在您的选择案例MyConn.BeginTrans()中没有MyConn.CommitTrans()MyConn.RollbackTrans()在插入语句之后;因此,当您尝试更新数据时会引发错误。如果您在插入执行之后提交或回滚,那么您的下一次执行应该可以正常工作。事实上 MyConn.BeginTrans() 位于简单的选择语句之前,您可以考虑在选择之后移动它。

我会做这样的事情(如果你想使用交易):

'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

事务通常用于插入/更新或删除数据。既然您评论过,您不知道为什么存在 BeginTrans() 语句,那么是的,您可以完全删除它,但我建议您阅读事务并确保在稍后发生的插入和更新语句之后不需要它编码。

Here is a reference for SQL transactions:

http://www.firstsql.com/tutor5.htm

于 2012-01-04T02:52:17.603 回答
0

我认为 MyConn 可能需要在最后关闭。这是你可以尝试的东西吗?

于 2012-01-03T15:17:33.933 回答
0

您已经在连接上有一个打开的记录集,所以我认为问题是您的数据库在记录集关闭之前不支持对同一连接的其他操作。作为修复,我会推荐以下三个选项之一:

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

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

  3. 或者将数据拉入数据表并循环通过该数据表而不是打开的记录集。

于 2012-01-03T15:18:19.333 回答