系统背景:使用MS-Access 2010在VBA中进行编码。目前正在处理模块后面的代码并调用存储过程。存储过程使用SQL编写,并在存储数据库的Ms-SQL server 2008应用程序上运行。
存储过程:存储过程的目的是:
注意: WOID和SampleID列位于tblWoSampleTest中,而Analyte位于tbltest
调用存储过程后,testId将保存到本地变量ThisTestID
CREATE PROCEDURE upGetTestIDForAnalyte @WOID nvarchar(60), @SampleID nvarchar(60),@Analyte nvarchar(60), @TestId int OUT
AS
SELECT @TestID = (Select TestID = t1.TestID
FROM tblWOSampleTest t1
JOIN tblTest t2
ON t1.TestID=t2.TestID
WHERE @WOID = t1.WOID AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte)
GO
我的问题是每次调用存储过程时,即使我知道测试ID存在且存储过程似乎正确运行,也会返回之前初始化为的值ThistestId。为了验证它存在,我采用了我的存储过程,只需运行:
Select TestID = t1.TestID
FROM tblWOSampleTest t1
JOIN tblTest t2
ON t1.TestID=t2.TestID
WHERE @WOID = t1.WOID AND @SampleID = t1.SampleID AND @Analyte = t2.Analyte
并返回了正确的testId(只有一个值)。我不认为数据类型存在问题,因为testid是一个不是字符串的数字。这也是我称之为的方式,虽然我很确定这种方法是正确的。
ThisTestId = 5
Set Conn = New ADODB.connection
Conn.ConnectionString = "connection string"
Conn.Open
Set cmd = New ADODB.Command
cmd.ActiveConnection = Conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "upGetTestIDForAnalyte"
cmd.Parameters.Append cmd.CreateParameter("@Analyte", adVarChar, adParamInput, 60, Analyte)
cmd.Parameters.Append cmd.CreateParameter("@WOID", adVarChar, adParamInput, 60, ThisWOID)
cmd.Parameters.Append cmd.CreateParameter("@SampleID", adVarChar, adParamInput, 60, 1)
cmd.Parameters.Append cmd.CreateParameter("@testid", adDouble, adParamOutput, , ThisTestID)
cmd.Execute
Conn.Close
msgbox ThisTestId
在这种情况下,将打印5
答案 0 :(得分:1)
检查您的参数是否在存储过程中用OUTPUT关键字标记
尝试为输出参数指定adParamReturnValue
cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)
然后,一旦使用cmd.Execute调用了存储过程,就必须读取值
ThisTestId = cmd.Parameters("@testid").Value
答案 1 :(得分:0)
我对SQL很陌生,但你的回归在哪里?
答案 2 :(得分:0)
您需要在命令执行后获取输出参数。
ThisTestId = Convert.ToInt32(cmd.Parameters("@testid").Value);