gpt4 book ai didi

c# - 从 Sql 选择范围标识

转载 作者:太空宇宙 更新时间:2023-11-03 21:20:03 25 4
gpt4 key购买 nike

我正在执行一个Insert 查询。我想返回标识元素。我也在使用同样的存储过程。在另一个存储过程中返回标识元素。

Alter Proc Proc1 
@name varchar(10),
@value int
As
Begin
insert into Table1
values (@name, @value)

return SCOPE_IDENTITY()

C#代码:

我有一个每次都调用我的数据库的方法,所以我使用它

_database.StoredProcedure = "Proc1";
_database.parameter("name","michael");
_database.parameter("value",10);

int id = Convert.ToInt32(_database.ExecuteScalar());

这里每次都得到id=0//BUG

SQL其他存储过程:

Alter Proc2
// Some other logic
Execute @id = Proc1 @name, @value // THIS WORKS

现在,如果我将 Proc1 的最后一行更改为 Select SCOPE_IDENTITY() from RETURN SCOPE_IDENTITY(),那么 C# 代码可以运行,但 Proc2 返回 0。

我应该怎么做才能让它在 C# 代码和 Proc2 中工作。

我想到了一个输出参数,但我不知道如何在 C# 中使用我的 this 数据库方法调用它。

最佳答案

如果您想要从过程中获取数据,正确的做法是使用输出参数。不要使用程序中的 return_value。此值指示执行状态,而不是过程中的数据。

这是一个示例。

Alter Proc Proc1 
@name varchar(10),
@value int,
@IdentityValue int OUTPUT

As
Begin
insert into Table1 values (@name,@value)
Select @IdentityValue = SCOPE_IDENTITY()
END
select * from table1
GO

Alter Proc2
(
@name varchar(10)
, @value int
, @IdentityValue int OUTPUT
)
as
//SOme other logic
declare @IdentityValue int
Execute Proc1 @name, @value, @IdentityValue OUTPUT

GO

另外,请注意您在 Proc1 中有一个插入,但您没有指定列。这是非常糟糕的做法。如果您的表结构发生变化,您的过程就会被破坏。您应该始终在插入内容中指定列。

关于c# - 从 Sql 选择范围标识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31414783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com