2013-08-27 155 views
0

我有一個存儲過程返回我添加的行的身份得到輸出,如下圖所示:無法從存儲過程

Create Procedure sp_ADD_CONTACT_EXTRANET_CLIENT 
(
@NumCRPCEN nvarchar (255), 
@nomContact nvarchar (255), 
@prenomContact nvarchar (255), 
@telFixe nvarchar (255), 
@telPort nvarchar (255), 
@mailContact nvarchar(255), 
@idPhysique int output 
) 
as 
Begin 
    INSERT INTO T_Physique values (.....) 
    SET @idPhysique = @@IDENTITY 
    RETURN @idPhysique 
End 

現在我想獲得在ADO.NET輸出和我」已經嘗試了很多東西,但最後一個是:

Requeteadd.Parameters.Add("@idPhysique", SqlDbType.Int).Direction = ParameterDirection.Output; 
      Requeteadd.ExecuteNonQuery(); 
      int IdPhysique = (int)Requeteadd.Parameters["@idPhysique"].Value; 

但它顯示我說錯誤,它說,返回值爲空。有人有想法嗎?

+0

@@ IDENTITY函數返回會話中生成的最後一個Identity值。由於您沒有生成任何,所以返回NULL。 – RBarryYoung

+0

是的,但是當我寫道:'選擇@@ IDENTITY作爲Id'而不是'SET @idPhysique = @@ IDENTITY RETURN @ idPhysique'並刪除參數列表中的參數@idPhysique作爲輸出,它顯示出正確的值 –

+2

將退貨退出。它設置了Proc的返回狀態,可能會搞亂ADO.net。 – RBarryYoung

回答

0

像@RBarryYoung說,該解決方案是如下:

Create Procedure sp_ADD_CONTACT_EXTRANET_CLIENT 
(
@NumCRPCEN nvarchar (255), 
@nomContact nvarchar (255), 
@prenomContact nvarchar (255), 
@telFixe nvarchar (255), 
@telPort nvarchar (255), 
@mailContact nvarchar(255), 
@idPhysique int output 
) 
as 
Begin 
    INSERT INTO T_Physique values (1, @nomContact, @prenomContact, (Select AdrLngId from T_Adresse where AdrStrRC = '74003'), 'T', 2, null, null, null, null, null, null, null, null, '*', @telFixe, @telPort, null, null, null, 1, @mailContact, null, null, null, null, null) 
    SET @idPhysique = @@IDENTITY 

End 
RETURN @idPhysique 

的輸出的返回必須結束之後。有關信息,在ADO.NET c#中,我通過執行此操作獲取返回值:

Requeteadd.Parameters.Add("@idPhysique", SqlDbType.Int).Direction = ParameterDirection.Output; 
      Requeteadd.ExecuteNonQuery(); 
      int IdPhysique = (int)Requeteadd.Parameters["@idPhysique"].Value; 
1

請勿使用RETURN來輸出數據 - 這是針對錯誤/狀態代碼的,並且僅限於INT,因此只要您需要「返回」其他數據類型,就需要做一些不同的事情。你有一個輸出參數,爲什麼不使用它?此外,使用SCOPE_IDENTITY()而不是@@IDENTITY,因爲後者可能會受到觸發器的影響,而不一定會給您剛生成的身份值。最後,always use the schema prefix when creating/referencing objectsnever use the sp_ prefix。您可以使用usp_來代替,但是這會添加什麼值?

CREATE PROCEDURE dbo.usp_ADD_CONTACT_EXTRANET_CLIENT 
    @NumCRPCEN nvarchar (255), 
    @nomContact nvarchar (255), 
    @prenomContact nvarchar (255), 
    @telFixe nvarchar (255), 
    @telPort nvarchar (255), 
    @mailContact nvarchar(255), 
    @idPhysique int output 
AS 
BEGIN 
    SET NOCOUNT ON; 
    INSERT INTO dbo.T_Physique values (.....); 
    SET @idPhysique = SCOPE_IDENTITY(); 
END 
GO