2013-07-25 13 views
5

Questo dovrebbe essere molto semplice, ma non ho ancora trovato una risposta concisa. Ho una stored procedure molto semplice in SQL Server che restituisce un valore intero. Tutto quello che voglio fare è ottenere quel valore di ritorno in una variabile da usare in Access.Assegna un valore di ritorno alla stored procedure ad una variabile VBA

stored procedure:

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 

Sto usando ADODB per eseguire la stored procedure, e mi sento stupida per dover chiedere questo, ma come faccio ad accedere il valore di ritorno in Access dopo corro cmd.Execute ? Grazie in anticipo e mi dispiace per la domanda zoppa.

risposta

4

Esistono due approcci, utilizzando i parametri di uscita o l'impostazione di ReturnValue (discussi di seguito). Per i parametri di uscita, di cui questo SO link:

essenzialmente si solo bisogno di creare uno SqlParameter, impostare la Direzione di uscita, e aggiungerlo alla collezione Parameters del SqlCommand. Quindi esegue la stored procedure e ottiene il valore del parametro.

Vedere il codice da quella pagina.

Tuttavia, è anche bisogno di includere la parola OUT (o uscita) nella dichiarazione di variabile:

@NextSumID integer OUT 

Quando si dichiara la variabile come OUT (o uscita) verrà restituito automaticamente, con qualsiasi valore ha quando termina la procedura, quindi puoi usare RETURN.

Return Data from a Stored Procedure :MSDN

È possibile, invece, utilizzare RETURN @NextSumID perché si sta solo restituendo un unico, intero, di valore. Per questo approccio, è necessario specificare il parametro come l'ReturnValue:

theParameter.Direction = ParameterDirection.ReturnValue 

Questo approccio è discusso ulteriormente here (MSDN).

+0

Grazie per la risposta. Ho deciso di abbandonare il 'RETURN @ NextSumID' e di usare' RETURN' perché il pezzo chiave che mi mancava era semplicemente assegnare la variabile con 'NextID = cmd.Parameters (" @ NextSumID ")'. Non so perché è stato così difficile per me capirlo. – philthyfool

+0

Mi ci è voluto un po 'per raccogliere le informazioni anche per la mia risposta;) –

+1

Mi sembra che ci siano alcuni esempi/documentazione migliori da qualche parte per l'utilizzo di base delle variabili di output della stored procedure. È davvero facile trovare situazioni in cui le persone aggiornano i recordset e quant'altro, ma non molte semplici situazioni di utilizzo. Spero che questo aiuti qualcun altro in una situazione simile come lo ero io. – philthyfool

1

Ecco come si ottiene il valore restituito utilizzando una stored procedure che restituisce un valore. È necessario fare riferimento a Libreria Microsoft ActiveX Data Objects 2.8.

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 
Problemi correlati