2009-11-10 47 views
4

該功能用於插入一行到一個SQL數據庫,需要返回創建的標識號3704的操作是不允許的:VBScript和ADO - 當對象被關閉

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

謝謝Brian。你可以請建議在哪裏我應該把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

我收到確切的錯誤,並設法追查到我在SQL Server存儲過程留下了PRINT語句。一旦我評論了PRINT語句,Recordset就返回了沒有錯誤的結果。