存储过程的输出参数仅返回零

时间:2014-06-25 15:41:23

标签: sql sql-server stored-procedures ms-access-2010

系统背景:使用MS-Access 2010在VBA中进行编码。目前正在处理模块后面的代码并调用存储过程。存储过程使用SQL编写,并在存储数据库的Ms-SQL server 2008应用程序上运行。

存储过程:存储过程的目的是:

  • 检索三个输入参数:WOID,SampleID和Analyte
  • 加入两个表:tblWoSampleTest,tblTest
  • 选择testID,其中三个值匹配

注意: 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

3 个答案:

答案 0 :(得分:1)

检查您的参数是否在存储过程中用OUTPUT关键字标记

尝试为输出参数指定adParamReturnValue

cmd.CreateParameter("@testid", adDouble, adParamOutput, , adParamReturnValue)

然后,一旦使用cmd.Execute调用了存储过程,就必须读取值

ThisTestId = cmd.Parameters("@testid").Value

答案 1 :(得分:0)

我对SQL很陌生,但你的回归在哪里?

http://msdn.microsoft.com/en-us/library/ms188655.aspx

答案 2 :(得分:0)

您需要在命令执行后获取输出参数。

  ThisTestId = Convert.ToInt32(cmd.Parameters("@testid").Value);