2012-01-03 1 views
0

내 기존 ASP 응용 프로그램에서 다음과 같은 오류가 점점 오전 : '80004005'"트랜잭션은이 커서 유형의 레코드 세트를 여러 개 가질 수 없습니다." 오류

거래 ODBC 드라이버 오류

Microsoft OLE DB 공급자가이 커서 유형의 여러 레코드를 가질 수 없습니다. 커서 형식을 변경하거나 트랜잭션을 커밋하거나 레코드 집합 중 하나를 닫습니다.

난 SQL Server 2008로 오라클의 코드를 마이그레이션하는 작업을하고,이 내가 모든 통해 응용 프로그램에서 여기 저기보고 계속 문제입니다.

수정 사항을 찾을 수 없습니다.

코드 블록이 특정의 경우 : 나 MyConn 최종 폐쇄 할 필요가 있다고 생각

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 
+0

내가 문제가 MyConn.BeginTrans가() 아니오 먼저 실행 한 후 커밋있다 없다 생각 : 여기

는 SQL 트랜잭션에 대한 참조입니다. 커밋하는 경우 다음 실행은 정상적으로 작동해야합니다. 그렇지 않으면 트랜잭션 외부에서 선택 항목을 이동하는 것을 고려할 수 있습니다. – Robert

+0

@ 로버트, 어디서 붙여야합니까? 솔직히, BeginTrans가 처음에 왜 거기에 있는지도 모르겠다. –

+0

원한다면 그냥 제거하면된다. 삽입 할 때 실패하면 기존 데이터를 잃어 버리지 않고 롤백 할 수 있습니다. - http://www.firstsql.com/tutor5.htm – Robert

답변

1

내가 더 나은 대답에

문제를 켭니다 싶어 코멘트에 대답하고는 MyConn.BeginTrans() 당신의 선택 경우 삽입 문 다음에 더 MyConn.CommitTrans() 또는 MyConn.RollbackTrans()이없는 것 같다; 따라서 데이터를 업데이트하려고하면 오류가 발생합니다. 삽입을 실행 한 후에 커밋하거나 롤백하면 다음 실행은 잘 작동합니다. MyConn.BeginTrans()가 간단한 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() 문이있는 이유를 모르겠다는 것을 알았으므로 나중에 모두 제거 할 수는 있지만 트랜잭션을 읽고 나중에 나중에 삽입 및 업데이트 문을 사용하지 않아도되는지 확인하는 것이 좋습니다. 코드.

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

+0

hm. 이 이상한 ... 디버거를 통해 갈 때 오류가 발생하지 않습니다. 하지만 디버거없이 똑같은 일을한다면 나에게 침착하게된다. 타이밍 문제 일 수 있을까? 내가 코드를 천천히 통과 할 때 처리 할 시간이 있는가? –

+0

내 코드가 있거나 원래 코드가 있습니까? – Robert

0

을 (I 그들을 짧게하도록 선택을 변경). 당신이 시도 할 수있는 무언가입니까 ??

+0

그것의 코드 블록 뒤에 사용되는 여기에 ....이 또한 "포함"파일 및 "conn"변수로 전달됩니다 ... 내가 그것을 닫으면 이제 다른 포함 할 수도 작동합니다. –

+0

또 다른 가능한 문제는 동일한 MyConn을 사용하여 while 루프 외부에서 하나의 내부 SQL 문과 다른 외부 SQL 문을 실행하는 것입니다. 다른 연결을 사용해보십시오. –

0

이미 연결에 열린 레코드 집합이 있으므로 레코드 집합이 닫힐 때까지 데이터베이스가 동일한 연결에서 추가 작업을 지원하지 않는다고 생각합니다. 수정, 나는 세 가지 옵션 중 하나를 추천 할 것입니다 :

  1. 테이블을 업데이트 SQL 문을 실행하는 두 번째 연결 (하는 당신은 트랜잭션을 실행)를 사용합니다.

  2. 레코드 집합을 반복하면서 레코드 집합을 닫은 다음 동일한 연결을 사용하여 명령문을 실행하는 동안 모든 문을 목록에 수집하십시오.

  3. 데이터를 데이터 테이블로 가져 와서 열린 레코드 집합이 아닌 루프로 반복하십시오. 이 이후

관련 문제