C# 如何知道要在另一个存储过程(从windows窗体插入)中使用的标识值

C# 如何知道要在另一个存储过程(从windows窗体插入)中使用的标识值,c#,.net,sql-server,winforms,stored-procedures,C#,.net,Sql Server,Winforms,Stored Procedures,我需要使用插入记录的标识值来插入另一个表。插入是使用存储过程完成的,存储过程是从winforms按钮事件调用的。过程已参数化,因此我无法在另一个过程中执行第一个过程 Procedure [dbo].[insert_trans] ( @name nvarchar(50), @email nvarchar(50), @ata_certification bit, @St1 nvarchar(50), @St2 nvarchar(50), @City nvarchar(MAX)

我需要使用插入记录的标识值来插入另一个表。插入是使用存储过程完成的,存储过程是从winforms按钮事件调用的。过程已参数化,因此我无法在另一个过程中执行第一个过程

Procedure [dbo].[insert_trans] (
  @name nvarchar(50),
  @email nvarchar(50),
  @ata_certification bit,
  @St1 nvarchar(50),
  @St2 nvarchar(50),
  @City nvarchar(MAX),
  @State nvarchar(MAX),
  @Country nvarchar(MAX),
  @Zipcode numeric(18, 0),
  @Qualification nvarchar(50),
  @Interpreting_service bit ,
  @Tran_Int_Degree bit,
  @Total_Experience int,
  @Native_language nvarchar(50),
  @Resume bit
) as
begin
    insert into Location_Master (
        St1,
        St2, 
        City, 
        State, 
        Country, 
        Zipcode
    ) values (
        @St1,
        @St2,
        @City,
        @State,
        @Country,
        @Zipcode)

    Declare @Location_id int
    set @Location_id = (SELECT CAST(SCOPE_IDENTITY() AS varchar(10))
                        AS LAST_IDENTITY)

    insert into Translators values (
        @name, 
        @email,
        @ata_certification,
        @Location_id,             
        @Qualification, 
        @Interpreting_service,
        @Tran_Int_Degree,             
        @Total_Experience, 
        @Native_language, 
        @Resume)

end
第二个过程,我需要生成sno

procedure insert_langknown (
    @translator_id int,
    @Language_code varchar(50)
) as
begin

    Insert into Language_known (
        translator_id,
        Language_code
    ) values (
        @translator_id,
        @Language_code)
end

翻译器id是必填字段

您可以通过以下方式获取最近插入的密钥

 EXEC [Schema].[YourSpName] @Parameter ='ParamValue'
 SELECT  @@Identity
Scope_Identity()将返回NULL,因为连接作用域将丢失

或者,您可以使用IDENT_CURRENT来确定实际结果,因为它不依赖于连接或范围

  EXEC [Schema].[YourSpName] @Parameter ='ParamValue'
  SELECT IDENT_CURRENT('YourTableName')
编辑1 正如Andomar所提到的,我建议您从存储过程返回Scope_标识,或者使用事务来确保锁定行

编辑2 您可以修改SP以返回输出值,在调用其他SP时可以使用该值,如下所示

存储过程

    ALTER PROCEDURE insertSomething
(
 @Name varchar(20),
 @EffectIveRows INT OUTPUT
)
AS

INSERT INTO dbo.YourTable 
VALUES (@Name)
SELECT @EffectIveRows = SCOPE_IDENTITY()
第二个SP

procedure insert_langknown
              (
                   @translator_id int,
                   @Language_code varchar(50)
                   @LastIdentityValue INT,

               )
               as
            begin
               -- USE @LastIdentityValue variable 
            Insert into Language_known (translator_id,Language_code) values ( @translator_id,@Language_code)
DECLARE @Output INT = 0
EXEC insertSomething 'A' , @EffectIveRows = @Output OUTPUT

EXEC insert_langknown @translator_id= 2, @Language_code= 'dummy Data'  ,@LastIdentityValue = @Output
呼叫您的SP

procedure insert_langknown
              (
                   @translator_id int,
                   @Language_code varchar(50)
                   @LastIdentityValue INT,

               )
               as
            begin
               -- USE @LastIdentityValue variable 
            Insert into Language_known (translator_id,Language_code) values ( @translator_id,@Language_code)
DECLARE @Output INT = 0
EXEC insertSomething 'A' , @EffectIveRows = @Output OUTPUT

EXEC insert_langknown @translator_id= 2, @Language_code= 'dummy Data'  ,@LastIdentityValue = @Output

您可以按如下方式从存储过程返回值

Select Scope_Identity()
command.ExecuteScalar()
并且可以访问vb.net代码中的返回值,如下所示

Select Scope_Identity()
command.ExecuteScalar()
否则,直接将插入值记录发送到另一个过程,如下所示

DECLARE @RETURNVAL INT
SELECT @RETURNVAL=SCOPE_IDENTITY()

EXEC ANOTHER_PROCEDURE @RETURNVAL,another_parameter


-- 'ANOTHER_PROCEDURE' is Storepd procedure name

可以发布代码吗?让第一个过程返回新插入的标识列的值。您可以使用是否需要过程或表单代码来检索新标识值?最好两者都需要。我想看看您正在使用什么类来调用进程,以及进程做什么。@Andomar我如何在另一个过程中使用scope_identity()返回值?-1这不是并发的。如果在调用
@@identity
ident_current()
之前,另一个连接插入了另一行,您将得到错误的值。@Andomar同意,我确实忘记了这一点。我用建议编辑了我的答案。你能修改我发布的第二个过程吗?@newuser我用修改过的SPi修改过我的sp1修改过我的答案,并在我的表单中添加了以下代码:SqlParameter retval=new SqlParameter(@EffectIveRows),SqlDbType.Int);retval.Direction=参数Direction.ReturnValue;命令.Parameters.Add(retval);但它给出了以下错误过程或函数“insert_trans”期望参数“@EffectIveRows”,但未提供该参数。