VBscript и ADO — 3704 Операция не разрешена, когда объект закрыт

Эта функция вставляет строку в базу данных SQL и должна вернуть созданный идентификационный номер:

Function WriteDatabase(backupTypeID, numImages, folderSize, success, errorMessage, strLogFileName)

    On Error Resume Next
    err.clear
    Set objConnection = CreateObject("ADODB.Connection")
    Set objRecordSet = CreateObject("ADODB.Recordset")
    objConnection.Open "Provider=SQLOLEDB;Data Source=x.x.x.x;Initial Catalog=DB;User ID=sa;Password=xxxxxx"
    sqlquery = "INSERT INTO tblImageCopies (BackupCopyDate, BackupCopyTypeID, NumImages, ImagesFolderSize, Success, ErrorMessage) VALUES (GETDATE(), " & backupTypeID & ", " & numImages & ", " & folderSize & ", " & success & ", " & errorMessage & "); SELECT scope_identity() AS ImageCopyID;" 
    objRecordSet.Open sqlquery,objConnection
    objRecordSet.MoveFirst
    WriteDatabase = objRecordSet("ImageCopyID")
    objRecordSet.Close
    objConnection.Close
    If err.number <> 0 Then
        WriteLog "Error writing to the EHN database - " & err.number & " " & err.description, strLogFileName
    End If

End Function

Он успешно вставляет строку, но я получаю сообщение об ошибке «3704 Операция не разрешена, когда объект закрыт». когда он пытается вернуть идентификационный номер в наборе записей. Когда я выполняю этот sql-запрос непосредственно на сервере, он работает. Кто-нибудь может помочь?


person VBscripter    schedule 10.11.2009    source источник


Ответы (3)


Я делаю то же самое (во всяком случае, очень похоже). Я считаю, что возвращаются два набора результатов: один для INSERT, а другой для SELECT. Попробуйте вызвать objRecordSet.NextRecordset().

person Brian    schedule 11.11.2009
comment
Спасибо, Брайан. Не могли бы вы посоветовать, где именно я должен поместить objRecordSet.NextRecordSet()? Я пробовал пару мест, но это все еще ошибка, я верю, что вы на правильном пути. - person VBscripter; 11.11.2009
comment
Хорошо, я понял, мне пришлось удалить objRecordset.MoveFirst и заменить его на Set objRecordSet2 = objRecordSet.NextRecordset(), а затем изменить строку возврата на WriteDatabase = objRecordSet2(ImageCopyID). Мне также пришлось удалить objRecordset.Close. Поскольку первый оператор в моем составном операторе не возвращает никаких строк (это оператор INSERT), objRecordset автоматически закрывается и не может быть закрыт снова, что приводит к ошибке. - person VBscripter; 11.11.2009
comment
Полезные советы об использовании NextRecordset и о том, как идентифицировать открытые наборы записей. - person user692942; 13.05.2017

Используйте «SET NOCOUNT ON;» в начале вашего запроса

person Olya    schedule 04.11.2010

Я получил точную ошибку и сумел отследить ее до оператора PRINT, который я оставил в своей хранимой процедуре SQL Server. Как только я прокомментировал оператор PRINT, набор записей вернул результаты без ошибок.

person Michael Melio    schedule 18.06.2013