C# 将ScopeIdentity用于存储过程中的标识列,asp.net
我创建了一个存储过程,并将值插入到3个表中:用户、工人和兽医。在Users表中,我有一个标识列UserID,它是Workers和Vets表的外键 当插入Workers和Vets表时,我似乎无法检索插入Users表的UserID的值 这是兽医的存储过程: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(
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表中插入一条记录。这是您想要获取数据库在标识列中存储的值的地方。然后,该值将以与现在相同的方式作为参数传递到以下调用中。不需要输出子句