«Транзакция не может иметь несколько наборов записей с этим типом курсора».ошибка - PullRequest
0 голосов
/ 03 января 2012

Я получаю следующую ошибку в моем классическом приложении asp:

Поставщик Microsoft OLE DB для драйверов ODBC, ошибка '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

Ответы [ 3 ]

1 голос
/ 04 января 2012

Поскольку в комментариях был дан ответ, я хотел превратить его в лучший ответ

Ваша проблема в том, что 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 (), тогда да, вы можете удалить его полностью, но я бы порекомендовал прочитать транзакции и убедиться, что он вам не нужен после операторов вставки и обновления, которые происходят позже в код.

Вот справочник по транзакциям SQL:

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

0 голосов
/ 03 января 2012

У вас уже есть открытый набор записей в соединении, поэтому я думаю, что проблема заключается в том, что ваша база данных не поддерживает дополнительные действия на том же соединении, пока набор записей не будет закрыт.В качестве исправления я бы порекомендовал один из трех вариантов:

  1. Использовать второе соединение (для которого выполняется транзакция) для запуска операторов sql, которые обновляют таблицу.

  2. Соберите все операторы в список, пока вы просматриваете набор записей, закройте набор записей и затем выполните операторы (используя то же соединение).

  3. Илиизвлеките данные в таблицу данных и переберите их, а не открывайте набор записей.

0 голосов
/ 03 января 2012

Я думаю, что MyConn может потребоваться закрыть в конце. Это то, что вы можете попробовать ??

...