2009-11-10 5 views
4

Cette fonction insère une ligne dans une base de données SQL et doit retourner le numéro d'identification créé:VBscript et ADO - 3704 Le fonctionnement est pas autorisée lorsque l'objet est fermé

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 

Il insère avec succès la ligne, mais je obtenez le message d'erreur '3704 L'opération n'est pas autorisée lorsque l'objet est fermé.' quand il essaie de renvoyer le numéro d'identité dans le jeu d'enregistrements. Lorsque j'exécute cette requête sql directement sur le serveur, cela fonctionne. Quelqu'un en mesure d'aider?

Répondre

6

Je fais la même chose (très similaire quand même). Je crois qu'il y a deux séries de résultats qui reviennent, l'une pour l'INSERT et l'autre pour le SELECT. Essayez d'appeler objRecordSet.NextRecordset().

+0

Merci Brian. Pouvez-vous s'il vous plaît aviser exactement où je devrais mettre objRecordSet.NextRecordSet()? J'ai essayé quelques endroits mais c'est toujours une erreur, je crois que vous êtes sur la bonne voie. – VBscripter

+1

Ok compris, j'ai dû supprimer objRecordset.MoveFirst et le remplacer par Set objRecordSet2 = objRecordSet.NextRecordset(), puis modifier la ligne de retour à WriteDatabase = objRecordSet2 ("ImageCopyID"). J'ai également dû supprimer objRecordset.Close. Comme la première instruction de mon instruction composée ne renvoie aucune ligne (c'est une instruction INSERT), objRecordset est automatiquement fermé et ne peut plus être fermé, générant ainsi l'erreur. – VBscripter

+0

[Astuces utiles ici] (http://stackoverflow.com/a/35313932/692942) sur l'utilisation de 'NextRecordset' et sur l'identification des jeux d'enregistrements ouverts. – Lankymart

4

Utilisez « SET NOCOUNT ON, » au début de votre requête

1

J'ai reçu l'erreur exacte, et a réussi à le suivre jusqu'à une instruction PRINT que je l'avais laissé dans mon SQL Server procédure stockée. Une fois que j'ai commenté l'instruction PRINT, le jeu d'enregistrements a renvoyé les résultats sans erreur.