C# 在执行存储过程之前,如何判断数据库中是否已经存在记录?

C# 在执行存储过程之前,如何判断数据库中是否已经存在记录?,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我想创建一个存储过程,将数据插入数据库中的表中,但它应该是唯一的,因此我首先检查传入参数: create procedure SP_Insert @name varchar(50) AS if not exists (select Name from Employees where Name = @name) begin insert into Employess (Name) values (@name) end 我的问题是

我想创建一个存储过程,将数据插入数据库中的表中,但它应该是唯一的,因此我首先检查传入参数:

create procedure SP_Insert
    @name varchar(50)
AS
    if not exists (select Name from Employees where Name = @name)
    begin 
        insert into Employess (Name) 
        values (@name)
    end
我的问题是,在执行存储过程后,如何在代码中判断传递的参数是否未被接受为唯一值


在我的表单中,我有一个按钮(Insert)和一个文本框(name),当用户单击“插入”时,文本值将传递给存储过程,我想弹出一个消息框,警告用户有重复的条目

使用@@ROWCOUNT确定某一行受到影响,并将该值作为参数返回。查看此答案:

使用@@ROWCOUNT确定某行受影响,并将该值作为参数返回。请参阅此答案:

存储过程可以返回值。 您可以将SP更改为以下内容:

create procedure SP_Insert
@name varchar(50)
AS
BEGIN
    if not exists (select Name from Employees where Name=@name)
    begin 
       insert into Employees (Name) Values (@name)
       Return 0
    end
    else begin
       Return 1
    end
END
以下是指向MSDN文章的链接,其中包含更多详细信息和示例:

存储过程可以返回值。 您可以将SP更改为以下内容:

create procedure SP_Insert
@name varchar(50)
AS
BEGIN
    if not exists (select Name from Employees where Name=@name)
    begin 
       insert into Employees (Name) Values (@name)
       Return 0
    end
    else begin
       Return 1
    end
END
以下是指向MSDN文章的链接,其中包含更多详细信息和示例: 您可以执行以下操作:

insert into Employess (Name) 
select @name
where not exists (select * from Employees where Name = @name)

select @@rowcount
现在,
@@rowcount
(返回给调用者)是零还是一取决于是否有插入

var recordsUpdated = command.ExecuteScalar();
实际上,您可以跳过
select@@rowcount
而不显式返回任何内容

var recordsUpdated = command.ExecuteNonQuery();
返回受影响记录的数量。我宁愿说得更清楚些。有人可能会回来更改该过程,以便它执行其他更改
@@rowcount
。(为什么?但他们可以)而且他们可能不知道下游的某些东西取决于受影响的记录计数。但如果它是显式的,无论是选定的值还是输出参数,那么有人可以判断出其他东西取决于该值。

您可以这样做:

insert into Employess (Name) 
select @name
where not exists (select * from Employees where Name = @name)

select @@rowcount
现在,
@@rowcount
(返回给调用者)是零还是一取决于是否有插入

var recordsUpdated = command.ExecuteScalar();
实际上,您可以跳过
select@@rowcount
而不显式返回任何内容

var recordsUpdated = command.ExecuteNonQuery();


返回受影响记录的数量。我宁愿说得更清楚些。有人可能会回来更改该过程,以便它执行其他更改
@@rowcount
。(为什么?但他们可以)而且他们可能不知道下游的某些东西取决于受影响的记录计数。但是如果它是显式的,无论是选定的值还是输出参数,那么有人可以判断出其他东西取决于该值。

这里的最佳方法。这里的最佳方法。那么,如果有20个人的名字是
Mohamed
,听起来你需要有一个不同的列呢要检查记录是否存在,还需要对
SQL
进行一些基本阅读,这将帮助您更好地解决问题。这就是我在编写上述示例时想到的,我的真实表格是Countries表格。然后,您应该根据实际表格显示代码/示例。。来吧,你也应该避免使用sp_uu前缀,或者干脆干脆跳过前缀。那么,如果你有20个人的名字是
Mohamed
,听起来你需要有一个不同的列来检查记录是否存在,也可以对
SQL
做一些基本的阅读,这将帮助你更好地解决你的问题。这就是我在写上述示例时想到的,我的实际表格是Countries表格。那么您应该根据实际表格显示代码/示例。。来吧,你也应该避免使用sp_uu前缀,或者干脆干脆跳过前缀。这行不通。return语句返回一个整数,用于指示执行状态。如果要获取返回的值,应使用输出参数。是的,存储过程可以返回值,但只能返回
INT
值,不能返回字符串@我认为这个答案是正确的。请参阅“请删除否决票”。@Diego最初返回的是字符串文字。我仍然会对此投反对票,因为它使用return语句将数据传回。返回的数据应使用输出参数。甚至在现在链接到答案的文章中也指出了这一点。但既然它至少能满足要求,我想我不会投反对票。@Diego我猜你投了这张票以“抵消”反对票。这不是应该的工作方式。如果这是使用输出参数,在我看来,这是值得投票的。这是行不通的。return语句返回一个整数,用于指示执行状态。如果要获取返回的值,应使用输出参数。是的,存储过程可以返回值,但只能返回
INT
值,不能返回字符串@我认为这个答案是正确的。请参阅“请删除否决票”。@Diego最初返回的是字符串文字。我仍然会对此投反对票,因为它使用return语句将数据传回。返回的数据应使用输出参数。甚至在现在链接到答案的文章中也指出了这一点。但既然它至少能满足要求,我想我不会投反对票。@Diego我猜你投了这张票以“抵消”反对票。这不是应该的工作方式。如果这是使用输出参数,在我看来是值得投票的。