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;

但它向我显示了一个错误,它说返回值为空。有人有想法吗?

4

2 回答 2

1

不要RETURN用于输出数据 - 这是用于错误/状态代码,并且仅限于INT,因此一旦您需要“返回”其他数据类型,您需要做一些不同的事情。你有一个输出参数,为什么不使用它呢?此外,请使用SCOPE_IDENTITY(),而不是@@IDENTITY,因为后者可能会受到触发器的影响,并且不一定会给您刚刚生成的身份值。最后,在创建/引用对象时始终使用模式前缀,并且永远不要使用sp_前缀。您可以改用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
于 2013-08-27T15:23:02.833 回答
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

输出的返回必须在 End 之后。有关信息,在 ADO.NET c# 中,我通过执行以下操作获取返回值:

Requeteadd.Parameters.Add("@idPhysique", SqlDbType.Int).Direction = ParameterDirection.Output;
            Requeteadd.ExecuteNonQuery();
            int IdPhysique = (int)Requeteadd.Parameters["@idPhysique"].Value;
于 2013-08-28T10:33:29.070 回答