【问题标题】:ExecuteScalar returns false for SQL count(*)ExecuteScalar 为 SQL 计数返回 false(*)
【发布时间】:2013-07-13 11:34:35
【问题描述】:

我有以下函数来检查我的 SQL 表中是否存在用户

private static bool  userexists(string user)
{
    bool userexists = false;

    SqlCommand c = new SqlCommand("SELECT COUNT(*) from UserTable where Username = @user");
    c.Parameters.Add(new SqlParameter("@user",user));
    using (SqlConnection con = new SqlConnection(Properties.Settings.Default.connectionString))
    {
        userexists = (bool)c.ExecuteScalar();
        return userexists;
    }
}

即使用户存在,它也会返回false,我做错了什么?

【问题讨论】:

  • 你在数据库中执行过同样的语句吗?它返回什么。我对这种方法也有保留。您应该检查用户 ID 而不是用户名。多个用户可以拥有相同的用户名,而用户 ID 将是唯一的。
  • 另外:在 SQL 中使用 IF EXISTS().... 方法在性能方面会更好。想象一下,您的表中有 1 亿用户;要检查给定用户的存在,根据您的方法,必须扫描 1 亿 行以计算该用户出现的次数。 IF EXISTS() 方法可以在找到匹配用户后立即停止扫描......

标签: c# sql sql-server sql-server-2008-r2


【解决方案1】:

既然你要取回一个数字,你应该这样转换它并添加一个条件来获得bool结果

userexists = (int) c.ExecuteScalar() > 0;

【讨论】:

    【解决方案2】:

    改变这一行:

            userexists = (bool)c.ExecuteScalar();
    

    到这里:

            userexists = (int32)c.ExecuteScalar() > 0;
    

    【讨论】:

      【解决方案3】:

      您可以通过

      解决您的问题
              userexists = (int)c.ExecuteScalar() > 0.
      

      但是,我也对这种方法持保留意见。您应该检查用户 ID 而不是用户名。多个用户可以拥有相同的用户名,而用户 ID 将是唯一的。

      【讨论】:

      • 输入可能是用户名,因此没有理由更改此查询。该函数检查用户是否存在,因此即使有多个匹配项,它也能完成工作(尽管我怀疑用户名不是唯一的)
      【解决方案4】:
      select CASE WHEN Count(*) > 0 THEN 1 ELSE 0 END as UserExists from.....
      

      【讨论】:

        猜你喜欢
        • 2019-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多