2013-08-28 310 views
0

我想從Excel VBA執行SQL Server存儲過程。該過程將行返回到結果集對象中。然而,運行代碼時,它拋出一個錯誤:Excel VBA執行SQL Server存儲過程 - 結果集拋出錯誤3704

3704 Operation is not allowed when the object is closed

注:
有有因爲Select查詢相同的連接對象上運行工作正常數據庫連接沒有問題。

這裏是我的代碼:

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim cmd As ADODB.Command 
Dim prm As ADODB.Parameter 
Dim rst As New ADODB.Recordset 

Set cn = New ADODB.Connection 
Set cmd = New ADODB.Command 
ThisWorkbook.initialize 
cn.Provider = "sqloledb" 
cn.Properties("Data Source").Value = ThisWorkbook.server 
cn.Properties("Initial Catalog").Value = ThisWorkbook.db 
cn.Properties("User ID").Value = "xxxxx" 
cn.Properties("Password").Value = "xxxxx" 
cn.Open 

Set cmd = New ADODB.Command 
cmd.CommandText = "Generate_KPI_Process_Quality_Check_RunTime" 
cmd.CommandType = adCmdStoredProc 
cmd.ActiveConnection = cn 

Set prm = cmd.CreateParameter("@currentMonth", adChar, adParamInput, 255, cmb_month.Value) 
cmd.Parameters.Append prm 

Set prm = cmd.CreateParameter("@center", adChar, adParamInput, 255, cmb_center.Value) 
cmd.Parameters.Append prm 

rst.CursorType = adOpenStatic 
rst.CursorLocation = adUseClient 
rst.CursorLocation = adUseServer 
rst.LockType = adLockOptimistic 

rst.Open cmd 

If (rst.BOF And rst.EOF) Then 
'Some Code 
End If 
+0

在哪一行它拋出這個錯誤? – jerussell

+0

Hi @jerussell,它會在代碼段末尾的If(rst.BOF和rst.EOF)Then ... **語句處引發錯誤。 –

+0

@Abhishek熊貓有沒有解決您的問題?如果是這樣,upvote和/或標記爲已回答。 – Tarik

回答

1

你必須爲Recordset Object

Open方法提供更多的參數嘗試rst.Open cmd, cn

+0

連接對象是一個可選參數。它可以解決由錯誤分配「cmd.ActiveConnection = cn」引起的問題,雖然 – Tarik

+0

你是對的,但我認爲這兩種解決方案在這種情況下工作 – 2013-08-28 13:03:10

+0

事實上,它會工作。但是,如果他決定採用您的解決方案,他會通過刪除可能成爲未來混淆之源的違規聲明來更好地清理其代碼。 – Tarik

1

使用設置的關鍵字來分配對象:

Set cmd.ActiveConnection = cn 

否則,Connection對象(恰好是連接字符串)的默認屬性將被分配來代替Connection對象本身。

+0

感謝您的幫助。但是,這並不奏效。它仍舊是舊的3704錯誤。 –

+0

我認爲這是一個問題,您必須使用set或delete整個語句並使用@mehow解決方案。 – Tarik

2

SET NOCOUNT ON 
在存儲過程中

- 這將防止輸出文本生成像「更新1個結果」。

+0

歡迎來到stackoverflow!這個答案有點簡潔,你可以解釋一下這個問題解決方法嗎? –

+0

Corley,看起來像存儲過程輸出干擾結果記錄集,所以OLEDB提供程序無法接收記錄集。 SET NOCOUNT ON禁止在INSERT/UPDATE等上生成輸出文本。 – nzeemin

+0

[Another question](http://stackoverflow.com/questions/14950443/run-time-error-3704-operation-is-not-allowed-when-the-object-is-closed-in-vb6)詢問這個相同的錯誤(在VB6中)和SET NOCOUNT是建議的答案。 –

0

只是把另一個記錄將包含結果集

Dim rst1 As New ADODB.Recordset 
SET rst1=rst.NextRecordset 'this will return the first resultset 

If rst1.BOF or rst1.EOF Then... 
    'some code 
End If