C# 如何知道要在另一个存储过程(从windows窗体插入)中使用的标识值
我需要使用插入记录的标识值来插入另一个表。插入是使用存储过程完成的,存储过程是从winforms按钮事件调用的。过程已参数化,因此我无法在另一个过程中执行第一个过程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)
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”,但未提供该参数。