我有一个存储过程,它返回添加行的标识,如下所示:
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。有没有人有想法?
答案 0 :(得分:1)
不要使用RETURN
输出数据 - 这是针对错误/状态代码的,并且仅限于INT
,因此只要您需要“返回”其他数据类型,就需要做点别的事。你有一个输出参数,为什么不使用它呢?此外,使用SCOPE_IDENTITY()
,而不是@@IDENTITY
,因为后者可能会受到触发器的影响,并且不一定会为您提供刚刚生成的标识值。最后,always use the schema prefix when creating / referencing objects和never 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;