2011-08-04 95 views
0

我使用Java的callable接口,並嘗試讀取SQL服務器中寫入的存儲過程的輸出變量值。SQL服務器異常:使用jdbc連接檢索數據時

存儲過程:

CREATE PROCEDURE [Get_Project_Name_Test] 
    @project_id int, 
    @project_name varchar(150) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET @project_name = (SELECT Name from Project where Project_Id = @project_id) 
END 
GO 

這裏@project_id是輸入變量和@project_name是輸出變量。我想從Java應用程序中讀取這個輸出變量的值。當我運行代碼時,我得到一個sql異常。

它說:

正式參數「@project_id」未聲明爲OUTPUT參數 ,但在請求的輸出傳遞的實際參數。

實際上,這不是輸出參數。 @project_id是用於檢索結果的輸入參數。它用來調用此存儲過程

CallableStatement cstmt = con.prepareCall("{call Get_Project_Name_Test(?)}"); 
cstmt.setInt(1, 148); 
cstmt.registerOutParameter(1, java.sql.Types.VARCHAR); 
cstmt.executeQuery(); 
String x = cstmt.getString(1); 
System.out.println(x); 

Java代碼,請幫我在這找出錯誤的原因。

在此先感謝。

回答

2

應該

cstmt.registerOutParameter(1, java.sql.Types.VARCHAR); 

cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); 

+0

感謝您的建議。我試過這個。但它沒有奏效。我得到異常「** SQLServerException:索引2超出範圍。**」 – Nazneen

+0

這是因爲您只傳遞一個參數到存儲過程,需要兩個; Get_Project_Name_Test(?,?) – Sean

+0

是的...非常感謝。它工作正常。我的印象是,在調用存儲過程時,我們只需要提供輸入參數。我現在得到了那部分。有用。再次感謝。 – Nazneen