C# 在C中从数据库中筛选重复的名称

C# 在C中从数据库中筛选重复的名称,c#,sql-server,C#,Sql Server,当调用一个方法时,如果名称已经存在,我希望返回true,如果名称已经存在,则返回false。我的示例代码如下 private bool NameDuplicate(string txt) { conn.Open(); com.Connection = conn; com.CommandText = "select Cat_d from Category"; SqlDataReader dr = com.ExecuteReader();

当调用一个方法时,如果名称已经存在,我希望返回true,如果名称已经存在,则返回false。我的示例代码如下

private bool NameDuplicate(string txt)
{
    conn.Open();
    com.Connection = conn;
    com.CommandText = "select Cat_d from Category";

    SqlDataReader dr = com.ExecuteReader();
    bool found = false;

    while (dr.Read())
    {
        if (txt == dr["Cat_d"].ToString())
        {
            found = true;
        }
        else
        {
            found = false;
        }
    }

    conn.Close();
    return found;
}


if (NameDuplicate(cat_txt))
{
    MessageBox.Show("Already exist!");
}

请帮我解释一下。

下面是一些代码,您可以使用这些代码,但我想指出,实际上,您可能不会费心在c中执行这些操作。您可以在db中添加一个唯一的约束/索引或主键,只需插入c中的值,就可以处理由于值已经存在而出现异常的情况。当sqlserver能够永远做到这一点时,在c中实现唯一性逻辑真的是自讨苦吃

private bool NameDuplicate(string txt)
{
  using(var con = new SqlConnection(YOUR CONNECTION STRING HERE)
  using(var com = new SqlCommand("select count(*) from Category where cat_d = @c", con){
    con.Open();
    com.Parameters.Add("@c", SqlDbType.VarChar, 999).Value = txt;
    var o = com.ExecuteScalar();

    con.Close(); //optional; dispose will do this too
    return Convert.ToInt32(o) != 0;
  }
}


if (NameDuplicate(cat_txt))
{
    MessageBox.Show("Already exist!");
}
始终使用using block来确保与数据库相关的资源得到处置,不要重用它们。您的连接和命令似乎是在其他地方定义的,您将它们保留很长时间/重用它们

为了检查是否存在,我们可以简单地计算条目的数量,执行calar并检查返回的数量。使用EXISTS查询可能会稍微快一点,但我选择了这种方法,因为它易于阅读,并且使代码更简单

下面是一个可以用来代替select计数的查询,以实现相同的效果。如果您正在搜索的列没有索引,那么使用它将非常有益,因为正如Aaron指出的那样,让sqlserver对整个表进行计数没有任何意义,而实际上,只要找到您正在查找的值并提供相同的答案,sqlserver就可以立即停止:

SELECT CASE WHEN EXISTS(SELECT null FROM Category where cat_d = @c) THEN 1 ELSE 0 END

下面是一些代码,你可以用它来做这件事,但我想指出,实际上,你可能不会费心在c中做这件事。您可以在db中添加一个唯一的约束/索引或主键,只需插入c中的值,就可以处理由于值已经存在而出现异常的情况。当sqlserver能够永远做到这一点时,在c中实现唯一性逻辑真的是自讨苦吃

private bool NameDuplicate(string txt)
{
  using(var con = new SqlConnection(YOUR CONNECTION STRING HERE)
  using(var com = new SqlCommand("select count(*) from Category where cat_d = @c", con){
    con.Open();
    com.Parameters.Add("@c", SqlDbType.VarChar, 999).Value = txt;
    var o = com.ExecuteScalar();

    con.Close(); //optional; dispose will do this too
    return Convert.ToInt32(o) != 0;
  }
}


if (NameDuplicate(cat_txt))
{
    MessageBox.Show("Already exist!");
}
始终使用using block来确保与数据库相关的资源得到处置,不要重用它们。您的连接和命令似乎是在其他地方定义的,您将它们保留很长时间/重用它们

为了检查是否存在,我们可以简单地计算条目的数量,执行calar并检查返回的数量。使用EXISTS查询可能会稍微快一点,但我选择了这种方法,因为它易于阅读,并且使代码更简单

下面是一个可以用来代替select计数的查询,以实现相同的效果。如果您正在搜索的列没有索引,那么使用它将非常有益,因为正如Aaron指出的那样,让sqlserver对整个表进行计数没有任何意义,而实际上,只要找到您正在查找的值并提供相同的答案,sqlserver就可以立即停止:

SELECT CASE WHEN EXISTS(SELECT null FROM Category where cat_d = @c) THEN 1 ELSE 0 END

当您只需对数据库执行简单查询时,为什么要将整个数据集加载到内存中?e、 g.从Cat_d=txt的类别中选择Cat_d,如果有任何结果,只需返回true。Joe_Dm谢谢。我将尝试你说的方法。当你可以对数据库进行简单的查询时,为什么要将整个数据集加载到内存中?e、 g.从Cat_d=txt的类别中选择Cat_d,如果有任何结果,只需返回true。Joe_Dm谢谢。我会照你说的去做。总的来说,这是个很好的建议。为什么要算数?如果您对任何可能存在的索引都了解得足够多,那么为什么不使用具有适当顺序的前1类索引呢?海滩上有沙子吗?嗯,我发现了一粒沙子,但让我数一数,然后再给你答案!老实说,我认为EXISTS是一种更安全的方法,并且仍然是相对自我记录的。@AaronBertrand我理解你的观点,但我没有看到使用计数的危害,在这种情况下,因为查询似乎是用来防止重复的,也应该被索引,所以无论如何只会有0或1的计数,指数会知道沙子的数量,所以我想我们不是在计算10亿粒沙子来确定沙子的存在,更像是我们去了一个沙滩,沙滩上有0或1粒沙子,当我们到达的时候有人可以告诉我们。。然而,我已经添加了一个EXISTS查询,这是一个替代品。总的来说,这是一个很好的建议。为什么要算数?如果您对任何可能存在的索引都了解得足够多,那么为什么不使用具有适当顺序的前1类索引呢?海滩上有沙子吗?嗯,我发现了一粒沙子,但让我数一数,然后再给你答案!老实说,我认为EXISTS是一种更安全的方法,并且仍然是相对自我记录的。@AaronBertrand我理解你的观点,但我没有看到使用计数的危害,在这种情况下,因为查询似乎是用来防止重复的,也应该被索引,所以无论如何只会有0或1的计数,指数会知道数量,所以我想我们不是在计算10亿粒沙子来确定沙子的存在,更像是在计算 海滩上有0到1粒沙子,有人能在我们到达时告诉我们。。然而,我添加了一个EXISTS查询,它只是一个替代品。