1

我試圖從Access 2013 VBA執行過程後從SQL Server 2008中的存儲過程獲取輸出變量(新標識列)。我不完全理解所有adodb的東西,並且我嘗試了很多來自不同文章的東西,但都無濟於事。下面是我與它現在在哪裏?從Access中的SQL Server存儲過程使用輸出參數

存儲過程:

PROCEDURE [proc_NewClient] 
    @Type INT, 
    @PhoneIntakeID INT, 
    @ClientID INT = NULL, 
    @NewPSID INT = null OUTPUT (2 possible ways to call the proc, one does not produce an output variable) 

    INSERT INTO tblClientDetails (ClientID, PhoneIntakeID, Client_Status) 
    VALUES (@ClientID, @PhoneIntakeID, 'Applicant') 

    DECLARE @NewClientDetailID int 
    SELECT @NewClientDetailID = SCOPE_IDENTITY() 

    INSERT INTO tblPS_Psychosocial (ClientDetailID, Client) 
    VALUES (@NewClientDetailID, @ClientID) 

    SELECT @NewPSID = SCOPE_IDENTITY() 

    INSERT INTO tblPS_AbuseHistory (PsychosocialID) 
    VALUES (@NewPSID) 

    INSERT INTO tblPS_FamilyHistory(PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_FinancialHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_LegalHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_MedicalHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_PsychiatricHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SocialHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SpiritualHistory (PsychosocialID) VALUES (@NewPSID) 
    INSERT INTO tblPS_SubstanceHistory (PsychosocialID) VALUES (@NewPSID) 

    INSERT INTO tblVocAssessment(ClientDetailID) VALUES (@NewClientDetailID) 

而且從形式我有:

Dim cnn As ADODB.Connection 
      Dim cmd As New ADODB.Command, rs As New ADODB.Recordset, param1 As New ADODB.Parameter, param2 As New ADODB.Parameter, param3 As New ADODB.Parameter, param4 As New ADODB.Parameter 
      Set cnn = New ADODB.Connection 
      cnn.ConnectionString = "DRIVER=SQL Server;SERVER=SRV-DB01;DATABASE=TWHClientMgmt;Trusted_Connection=Yes" 

      cnn.Open cnn.ConnectionString 

      Set cmd = New ADODB.Command 
      cmd.ActiveConnection = cnn 
      cmd.CommandType = adCmdStoredProc 
      cmd.CommandText = "[THEWOMENSHOME\jboyd].proc_NewClient" 


      Set param1 = cmd.CreateParameter("@Type", adinteger, adparamInput, , 2) 
      cmd.Parameters.Append param1 
      Set param2 = cmd.CreateParameter("@PhoneIntakeID", adinteger, adparamInput, , Me.PhoneIntakeID) 
      cmd.Parameters.Append param2 
      Set param3 = cmd.CreateParameter("@ClientID", adinteger, adparamInput, , intNewID) 
      cmd.Parameters.Append param3 
      Set param4 = cmd.CreateParameter("@NewPSID", adinteger, adParamOutput) 
      cmd.Parameters.Append param4 

rs.open cmd 

至此代碼工作的新記錄生成等等。當我從SQL Server運行存儲過程時,它會返回正確的標識列號,但我嘗試了多種方法來引用VBA中的輸出,並始終以null結尾。我如何正確引用它?

+1

而不是'rs.Open'嘗試'cmd.Execute',然後查看是否可以使用'cmd.Parameters(「@ NewPSID」)。Value'檢索輸出參數的值。 –

+1

您還可以使用新的ID數據使SP返回記錄集,並使用新的ID數據在一行/一列中讀取此數據,並在傳遞查詢中使用select子句讀取此數據 –

+0

@GordThompson謝謝!我曾嘗試過這種組合,但沒有參數上的.value,那就是票!它現在完美運行! –

回答

3

要檢索存儲過程的輸出參數的值,你只需.Execute的ADODB.Command,然後獲取相應的ADODB.Parameter的.Value,像這樣:

cmd.Execute 
' retrieve and display the returned OUTPUT parameter value 
Debug.Print cmd.Parameters("@NewPSID").Value 
0

簡單的DAO解決方案調用存儲過程:

Public Function RunSqlQuery(q As String) As Variant 

Dim cdb As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim rs As Recordset 

Set cdb = CurrentDb 
Set qdf = cdb.CreateQueryDef("") 
qdf.Connect = cdb.TableDefs("dbo_Setup").Connect ' your attached table 
qdf.SQL = q 
qdf.ReturnsRecords = True 
Set rs = qdf.OpenRecordset() 
RunSqlQuery = rs.Fields(0) ' you also can output more than one parameter from a stored procedure as fields 
rs.Close 
Set rs = Nothing 
Set qdf = Nothing 
Set cdb = Nothing 

End Function 

現在,調用函數,定義查詢,你會在SQL服務器做同樣的方式:

? RunSQLQuery("DECLARE @param1 varchar(16); exec proc_MyStoredProcedure @param1 OUTPUT; SELECT @param1") 
相關問題