我尝试从Access 2013 VBA执行过程后从SQL Server 2008中的存储过程获取输出变量(新标识列)。我并不完全理解所有的adodb内容,而且我从不同的文章中尝试了很多东西,但没有用。我现在就在这里...
存储过程:
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。我如何正确引用它?
答案 0 :(得分:7)
要检索存储过程的OUTPUT参数的值,只需.Execute
ADODB.Command,然后检索相应ADODB.Parameter的.Value
,如下所示:
cmd.Execute
' retrieve and display the returned OUTPUT parameter value
Debug.Print cmd.Parameters("@NewPSID").Value
答案 1 :(得分: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")