0

従来のaspアプリケーションで次のエラーが発生します。

Microsoft OLE DB ProviderforODBCドライバーエラー「80004005」

トランザクションは、このカーソルタイプで複数のレコードセットを持つことはできません。カーソルの種類を変更するか、トランザクションをコミットするか、レコードセットの1つを閉じます。

私はコードをOracleからSQLServer2008に移行する作業を行っていますが、これはアプリケーション全体を通して、あちこちで見られる問題です。

修正が見つからないようです。

このコードブロックのこの特定のケース:(選択を変更して短くしました)

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()が単純なselectステートメントの前にあるという事実は、selectの後に移動することを検討するかもしれません。

私はこのようなことをします(トランザクションを使用したい場合):

'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()ステートメントがなぜそこにあるのかわからないので、はい、それを完全に削除することができますが、トランザクションを読んで、後で発生する挿入および更新ステートメントの後にそれが必要ないことを確認することをお勧めしますコード。

SQLトランザクションのリファレンスは次のとおりです。

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

于 2012-01-04T02:52:17.603 に答える
0

最後に MyConn を閉じる必要があるかもしれません。これはあなたが試すことができるものですか?

于 2012-01-03T15:17:33.933 に答える
0

接続で既に開いているレコードセットがあるため、問題は、レコードセットが閉じられるまで、データベースが同じ接続で追加のアクションをサポートしていないことだと思います。修正として、次の 3 つのオプションのいずれかをお勧めします。

  1. (トランザクションを実行する) 2 番目の接続を使用して、テーブルを更新する SQL ステートメントを実行します。

  2. レコードセットをループしながらすべてのステートメントをリストに収集し、レコードセットを閉じてから、(同じ接続を使用して) ステートメントを実行します。

  3. または、データをデータ テーブルにプルし、開いているレコードセットではなく、それをループします。

于 2012-01-03T15:18:19.333 に答える