无法从存储过程获取输出

时间:2013-08-27 14:53:49

标签: sql-server-2008 c#-4.0 stored-procedures ado.net

我有一个存储过程,它返回添加行的标识,如下所示:

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;

但是它显示了一个错误,它表示返回的值为null。有没有人有想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;