Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 无法从存储过程获取输出_Sql Server 2008_C# 4.0_Stored Procedures_Ado.net - Fatal编程技术网

Sql server 2008 无法从存储过程获取输出

Sql server 2008 无法从存储过程获取输出,sql-server-2008,c#-4.0,stored-procedures,ado.net,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), @idPhy

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

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
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中获得输出,我尝试了很多方法,但最后一个是:

Requeteadd.Parameters.Add("@idPhysique", SqlDbType.Int).Direction = ParameterDirection.Output;
            Requeteadd.ExecuteNonQuery();
            int IdPhysique = (int)Requeteadd.Parameters["@idPhysique"].Value;
但它向我显示了一个错误,它说返回值为null。有人有什么想法吗?

不要使用返回到输出数据-这是用于错误/状态代码的,并且仅限于INT,因此一旦需要返回其他数据类型,就需要执行不同的操作。您有一个输出参数,为什么不使用它呢?另外,请使用SCOPE_IDENTITY,而不是@IDENTITY,因为后者可能会受到触发器的影响,并且不一定会给您刚才生成的标识值。最后,还有。你可以用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

正如@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 (.....)
    SET @idPhysique = @@IDENTITY
    RETURN @idPhysique
End
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;

@IDENTITY函数返回会话中生成的最后一个标识值。因为您没有生成任何,所以返回NULL。是的,但当我写入时:选择@@IDENTITY作为Id,而不是设置@idPhysique=@@IDENTITY RETURN@idPhysique,并从参数列表中删除作为输出的Parameter@idPhysique,它会显示正确的值并将返回值取出。它设置了进程的返回状态,可能会弄乱ADO.net。它在@rbaryyoung工作,谢谢你,我看你给出的代码没有任何问题。你应该会得到想要的结果。我在很多环境中做过很多次。