什么是'int'类型函数的返回变量(sql查询函数)

时间:2014-08-28 14:37:56

标签: c# asp.net

下面我声明一个巫婆类型的函数是'int'。我为sql查询声明了这个函数,它将int作为输出。在这里,我必须返回一些东西。但是我无法理解我在'int'类型函数中返回的内容。

    public int Login(LoginClass loginClassObj)
    {
        string connectionString = @"Data Source=localhost;Initial Catalog=LoginTest;Integrated Security=True";
        SqlConnection connection = new SqlConnection(connectionString);
        connection.Open();

        string query = @"SELECT COUNT(log_in) FROM login_table WHERE username = '"+loginClassObj.Username+"' AND password = '"+loginClassObj.Password+"'";
        SqlCommand command = new SqlCommand(query,connection);
        command.ExecuteNonQuery();
        return ???;  
    }

2 个答案:

答案 0 :(得分:8)

嗯,您有查询...但出于某种原因,您正在调用ExecuteNonQuery。您应该指定ExecuteScalar以获取单个值。然后,您可以将结果转换为int

return (int) command.ExecuteScalar();

我认为重点是返回匹配用户的数量,虽然这有点奇怪。

此外:

  • 您应该对连接和命令使用using语句,以便正确处理
  • 永远不要像这样将值嵌入到SQL中 - 改为使用参数化SQL,以避免SQL注入攻击和其他问题。有关示例,请参阅SqlCommand.Parameters的文档。
  • 如果您确实直接在数据库中获取了密码,那么这是一个重大问题。希望它实际上是一些描述的摘要
  • 不清楚为什么您已宣布方法返回int开始。也许您应该声明它返回bool而不是?方法声明是给你的吗?您应该始终了解参数和返回类型的含义 - 否则您无法正确实现该方法。

答案 1 :(得分:2)

这样的事情应该起作用并解决大多数问题:

public bool Login(LoginClass loginClassObj)
{
    string connectionString = ...
    using(SqlConnection connection = new SqlConnection(connectionString))
    using(SqlCommand command = connection.CreateCommand())
    {
        connection.Open();
        command.CommandText = @"SELECT COUNT(log_in) FROM login_table
                                WHERE username = @username AND hash = @hash";
        command.Parameters.AddWithValue("username", loginClassObj.Username);
        command.Parameters.AddWithValue("hash", loginClassObj.GetSecureHash());
        int count = Convert.ToInt32(command.ExecuteScalar());
        return count == 1;
    }
}

但是,在许多情况下,您可能需要在用户名上进行初始查询以找到salt - 可能是同时检索哈希值,然后使用salt执行安全哈希,并比较本地计算哈希到存储的哈希。