繁体   English   中英

SQL C#检查记录是否存在,是否存在删除

[英]SQL C# Check if record exists, if exists delete

使用存储过程尝试检查记录是否存在,如果存在,则应通过删除并提供适当的消息来进行检查(如果不发送其他消息)。 这是我的C#代码。

protected void deleteButton_Click(object sender, EventArgs e)
{
    int deletedCustomers;

    if (String.IsNullOrEmpty(txtCustID.Text))
    {
        lblError.Text = "Please enter a valid Customer ID";
        return;
    }
    else
    {
       dynamic procedure = "dbo.deleteCustomer";

       using (command = new SqlCommand(procedure, conn))
       {
           command.CommandType = CommandType.StoredProcedure;
           command.Parameters.AddWithValue("@CustID", txtCustID.Text);
       }

       try
       {
           conn.Open();
           command.ExecuteNonQuery();
           deletedCustomers = command.ExecuteNonQuery();

           if (deletedCustomers > 0) {
               lblError.Text = "Deleted!";   
           }
           else
           {
               lblError.Text = "Customer ID does not exist";
           }

           conn.Close();              
       }
       catch (Exception ex)
       {
           lblError.Text = "Error: " + ex.Message;
           conn.Close();
       }
    }
}

这是我的SQL Server存储过程:

CREATE PROCEDURE [dbo].[deleteCustomer]
     @CustID INT
AS
     DELETE FROM [dbo].[Customer]
     WHERE CustID = @CustID

运行此代码会删除我想要的记录,但是不会输出正确的标签,当我尝试删除不存在或不存在的记录时,它会为我提供“不存在”文本输出,而从不输出“已删除”文本IF语句中的输出。

我需要在IF语句中进行什么更改才能使其看到command.ExecuteNonQuery等于或不等于任何值,因此我可以获取它以显示正确的输出? 谢谢。

另外,如果您仔细阅读ExecuteNonQuery上的MSDN文档,则会发现:

对于UPDATE,INSERT和DELETE语句,返回值是该命令影响的行数。 当要插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。 对于所有其他类型的语句,返回值为-1。 如果发生回滚,则返回值也为-1。

未列出存储过程。 添加select @@ROWCOUNT (请参阅@mmushtaq答案),或使用DELETE FROM [dbo].[Customer] WHERE CustID = @CustID而不是过程。 最后:您真的需要进行此类查询的过程吗?

您需要获取@@ROWCOUNT ,如下所示:

CREATE PROCEDURE [dbo].[deleteCustomer]
@CustID INT
AS
DELETE FROM [dbo].[Customer]
WHERE CustID = @CustID
select @@ROWCOUNT

它将返回No of effective rows

删除此声明

command.ExecuteNonQuery();

并用这个

 deletedCustomers = command.ExecuteScalar();

编辑

try
       {
           conn.Open();

           deletedCustomers = command.ExecuteScalar();

           if (deletedCustomers > 0) {
               lblError.Text = "Deleted!";   
           }
           else
           {
               lblError.Text = "Customer ID does not exist";
           }

           conn.Close();              
       }

在大多数情况下, command.ExecuteNonQ‌​uery返回-1作为返回值

对于UPDATE,INSERT和DELETE语句,返回值是该命令影响的行数。 当要插入或更新的表上存在触发器时,返回值包括受插入或更新操作影响的行数以及受一个或多个触发器影响的行数。 对于所有其他类型的语句,返回值为-1。 如果发生回滚,则返回值也为-1。

根据其他帖子的建议,您需要获取@@ ROWCOUNT

请参阅链接以获取更多详细信息https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM