C# 将ScopeIdentity用于存储过程中的标识列,asp.net

C# 将ScopeIdentity用于存储过程中的标识列,asp.net,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我创建了一个存储过程,并将值插入到3个表中:用户、工人和兽医。在Users表中,我有一个标识列UserID,它是Workers和Vets表的外键 当插入Workers和Vets表时,我似乎无法检索插入Users表的UserID的值 这是兽医的存储过程: CREATE PROCEDURE [dbo].[InsertIntoVets] @PrimeiroNome Varchar(20), @NomeDoMeio Varchar(50), @Sobrenome Varchar(

我创建了一个存储过程,并将值插入到3个表中:用户、工人和兽医。在Users表中,我有一个标识列UserID,它是Workers和Vets表的外键

当插入Workers和Vets表时,我似乎无法检索插入Users表的UserID的值

这是兽医的存储过程:

CREATE PROCEDURE [dbo].[InsertIntoVets]
    @PrimeiroNome Varchar(20),
    @NomeDoMeio Varchar(50),
    @Sobrenome Varchar(30),
    @DataDeNascimento Date,
    @EndereçoPostal1 Varchar(120),
    @EndereçoPostal2 Varchar(120),
    @Cidade Varchar(100),
    @Especialidade_id Int,
    @Clinica_id Int,
    @UserID Int OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON;

    INSERT INTO Veterinarios([Primeiro nome], [Nome do meio], Sobrenome, [Data de Nascimento], [Endereço Postal1], [Endereço Postal2], Cidade, Especialidade_id, Clinica_id, UserID)
    VALUES (@PrimeiroNome, @NomeDoMeio, @Sobrenome, @DataDeNascimento, @EndereçoPostal1, @EndereçoPostal2, @Cidade, @Especialidade_id, @Clinica_id, @UserID)

    SET @UserID = SCOPE_IDENTITY();
END
C代码:

// Vets
SqlCommand sqlCommandVets = new SqlCommand();
sqlCommandVets.CommandType = System.Data.CommandType.StoredProcedure;
sqlCommandVets.CommandText = "InsertIntoVets";

sqlCommandVets.Parameters.Add("@PrimeiroNome", SqlDbType.VarChar).Value = (primeiroNome.Text.Trim());
sqlCommandVets.Parameters.Add("@NomeDoMeio", SqlDbType.VarChar).Value = (nomeDoMeio.Text.Trim());
sqlCommandVets.Parameters.Add("@Sobrenome", SqlDbType.VarChar).Value = (sobrenome.Text.Trim());
sqlCommandVets.Parameters.Add("@DataDeNascimento", SqlDbType.Date).Value = (dataDeNascimento.Text.Trim());
sqlCommandVets.Parameters.Add("@EndereçoPostal1", SqlDbType.VarChar).Value = (enderecoPostal1.Text.Trim());
sqlCommandVets.Parameters.Add("@EndereçoPostal2", SqlDbType.VarChar).Value = (enderecoPostal2.Text.Trim());
sqlCommandVets.Parameters.Add("@Cidade", SqlDbType.VarChar).Value = (cidade.Text.Trim());
sqlCommandVets.Parameters.Add("@Especialidade_id", SqlDbType.Int).Value = (dropDownEspecialidade.SelectedValue);
sqlCommandVets.Parameters.Add("@Clinica_id", SqlDbType.VarChar).Value = (dropDownClinica.SelectedValue);
sqlCommandVets.Parameters.Add("@UserID", SqlDbType.Int).Direction = ParameterDirection.Output;

sqlCommandVets.Connection = con;
这里有用户和兽医表的屏幕截图:

我希望我是清楚的,并提供了足够的信息

提前谢谢大家,,
雨果·席尔瓦。

这不需要输出参数。只需更改将用户数据插入的存储过程

CREATE PROCEDURE [dbo].[InsertIntoUsers]
    .....
    SELECT SCOPE_IDENTITY();
END
然后,您可以使用ExecuteScalar执行存储过程,并从由一行一列组成的存储过程中获取结果

int id = Convert.ToInt32(sqlCommandUsers.ExecuteScalar());
此时,您有了要在Vets和Workers表中设置的UserID列的值。只需将其作为普通参数传递给存储过程


此外,在对数据库进行多次更新的上下文中,您应该确保将所有内容都插入数据库中。如果在插入VET时出现问题,您希望在Users and Workers表中完成所有操作,或者在执行sqlcommand时一切顺利,请使用ExecuteScalar而不是ExecuteOnQuery,并按照原样制定存储过程,尽管许多其他人会建议通过SELECT语句返回,我建议坚持使用ExecuteOnQuery。它对于SQL Server和调用应用程序都更有效,因为不需要创建数据库对象,也不需要直接或透明地使用对象来读取它

我通常会显式声明输出参数,然后附加它们。执行ExecuteOnQuery后,可以通过.Value属性访问参数

注意1:。值是一个对象,因此请注意空值的可能性

SqlParamater opUserID = new SqlParameter("@UserID",sqlDbType.Int);
opUserID.Direction = ParameterDirection.Output;
sqlCommandVets.Parameters.Add (opUserID);

sqlCommandVets.ExecuteNonQuery();
int NewUserID = (int)opUserID.Value;

?在哪里尝试ge+t输出参数??插入是如何执行的?我在网上搜索,在某个网站上,他们说你必须将其声明为输出,我真的不明白为什么。我只想获取为兽医插入到用户表中的值。如果在插入兽医后使用SCOPE_IDENTITY。它将为您提供Veterinarios表而不是Users表的标识值。检查其他网站上文章的链接,找出错误答案。如果该网站关闭或该url被更改,您的答案是无用的。最好在这里包含详细信息,并提供一个引用以给予信任。我应该如何将其作为正常参数传递?我不需要向它声明某种值吗?我不能只做sqlCommandVets.Parameters。Add@UserID,SqlDbType.Int;如果我正确理解了您的逻辑,那么首先在Users表中插入一条记录。这是您想要获取数据库在标识列中存储的值的地方。然后,该值将以与现在相同的方式作为参数传递到以下调用中。不需要输出子句