2014-06-25 79 views
0

系統背景:使用MS-Access 2010在VBA中進行編碼。當前正在處理模塊後面的代碼並調用存儲過程。存儲過程用SQL編寫,並在存儲數據庫的Ms-SQL服務器2008應用程序上運行。存儲過程的輸出參數僅返回零

存儲過程:存儲過程的目的是:

  • 檢索三個輸入參數:WOID,SampleID和分析物
  • 加入兩個表:tblWoSampleTest,TBLTEST
  • 選擇testID其中三個值匹配

說明: WOID和SampleID colu MN在tblWoSampleTest和分析物是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 

我的問題是我每次調用存儲過程時,該值ThistestId之前被初始化爲返回,即使我知道測試ID存在,並且存儲過程似乎正常運行。爲了驗證它的存在我把我的存儲過程,簡單地跑:

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將打印

回答

1

檢查您的參數標有OUTPUT關鍵字在你的存儲過程

嘗試指定adParamReturnValue爲輸出參數

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

然後,一旦你調用CMD的存儲過程。執行你必須讀取值

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

是這樣的事嗎?在我保留行_cmd.parameters ... _ 'cmd.Parameters.Append cmd.CreateParameter(「@ testid」,adDouble,adParamOutput,ThisTestID)' 'cmd.Execute' 'Conn.Close ' 'ThisTestID = cmd.Parameters(「@ testid」)。價值' – VictoriaJay

+0

是的。執行該過程後,您需要讀取參數值。你得到了什麼 ? – NicoD

+0

我在'ThisTestID = cmd.Parameters(「@ testid」)行得到一個錯誤無效的使用null值 – VictoriaJay

0

你需要得到命令執行後的輸出參數。

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

當我嘗試執行你的,我得到一個n在_parameters_錯誤,說子或功能未定義 – VictoriaJay

+0

現在檢查...... – Jesuraja

+0

更新..,檢查它.. – Jesuraja