2009-11-10 1 views
4

Эта функция вставляет строку в базу данных SQL и нужно возвращать идентификационный номер созданного:VBscript и ADO - 3704 Операция не разрешена, если объект закрыт

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-запрос непосредственно на сервере, он работает. Любой, кто может помочь?

ответ

6

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

+0

Спасибо Брайан. Можете ли вы, пожалуйста, точно указать, куда мне следует поместить objRecordSet.NextRecordSet()? Я пробовал пару мест, но это все еще ошибка, я считаю, что вы на правильном пути. – VBscripter

+1

Итак, выяснилось, мне пришлось удалить objRecordset.MoveFirst и заменить его Set objRecordSet2 = objRecordSet.NextRecordset(), затем изменить обратную линию на WriteDatabase = objRecordSet2 ("ImageCopyID"). Мне также пришлось удалить objRecordset.Close. Поскольку первый оператор в моей составной инструкции не возвращает никаких строк (это оператор INSERT), objRecordset автоматически закрывается и не может быть снова закрыт, что порождает ошибку. – VBscripter

+0

[Полезные советы здесь] (http://stackoverflow.com/a/35313932/692942) об использовании 'NextRecordset' и о том, как идентифицировать открытые наборы записей. – Lankymart

4

использования «SET NOCOUNT ON;» в начале вашего запроса

1

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