2013-07-25 79 views
5

這應該很容易,但我還沒有找到真正簡潔的答案。我在sql server中有一個非常簡單的存儲過程,它返回一個整數值。我想要做的就是將該返回值轉換爲Access中使用的變量。將存儲過程返回值分配給VBA變量

存儲過程:

ALTER PROCEDURE [dbo].[out_GetNextID] 
@NextSumID integer 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT @NextSumID = IDENT_CURRENT('Outage Summary')+IDENT_INCR('Outage Summary') 
RETURN @NextSumID 
END 

我使用ADODB來執行存儲過程,我覺得啞了不必問這個,但我如何訪問訪問返回值我跑cmd.Execute後?預先感謝併爲跛腳問題感到遺憾。

回答

4

有兩種方法,使用輸出參數或設置ReturnValue(下面討論)。對於輸出參數,從這個SO link報價:

基本上你只需要創建一個SqlParameter的,該方向 設置爲輸出,並把它添加給SqlCommand的Parameters集合。然後 執行存儲過程並獲取參數的值。

查看該頁面的代碼。

不過,您還需要在您的變量聲明出來的字(或輸出):

@NextSumID integer OUT 

當你聲明爲OUT(或輸出),它會自動返回,與任何值的變量它在程序結束時有,所以你可以使用RETURN。

Return Data from a Stored Procedure :MSDN

可以,而是使用RETURN @NextSumID因爲你只是返回一個單一的,整數值。對於這種方法,你需要指定參數作爲ReturnValue

theParameter.Direction = ParameterDirection.ReturnValue 

這種方法進一步here (MSDN)討論。

+0

感謝您的回覆。我決定拋棄'RETURN @ NextSumID',只使用'RETURN',因爲我丟失的關鍵部分僅僅是通過'NextID = cmd.Parameters(「@ NextSumID」)'來分配變量。我不知道爲什麼我很難弄清楚。 – philthyfool

+0

我花了一段時間整理了我的答案的信息;) –

+1

我感覺好像存儲過程輸出變量的基本用法應該有一些更好的文檔/示例。很容易找到人們更新記錄集的情況,而不是很多簡單的使用情況。希望這能幫助那些和我一樣處於類似困境的人。 – philthyfool

1

下面介紹如何使用返回值的存儲過程獲取返回值。您需要參考Microsoft ActiveX Data Objects 2.8 Library

Sub CheckValue(ByVal NextSumID As Long) 

    'open connnection 
    Dim ACon As New Connection 
    ACon.Open ("Provider=SQLOLEDB;Data Source=<SqlServer>;" & _ 
     "Initial Catalog=<Table>;Integrated Security=SSPI") 

    'set command 
    Dim ACmd As New Command 
    Set ACmd.ActiveConnection = ACon 
    ACmd.CommandText = "out_GetNextID" 
    ACmd.CommandType = adCmdStoredProc 

    'Return value must be first parameter else you'll get error from too many parameters 
    'Procedure or function "Name" has too many arguments specified. 
    ACmd.Parameters.Append ACmd.CreateParameter("ReturnValue", adInteger, adParamReturnValue) 
    ACmd.Parameters.Append ACmd.CreateParameter("NextSumID", adVarChar, adParamInput, 10, NextSumID) 

    'execute query 
    Call ACmd.Execute 

    'get return value 
    Debug.Print "Return value: " & ACmd.Parameters("ReturnValue") 

    ACon.Close 

End Sub