【问题标题】:how do i get column value from sql server 2008?如何从 sql server 2008 获取列值?
【发布时间】:2013-09-08 18:05:20
【问题描述】:

我有一个有 5 列的表格:

我这样写代码:

String SQLQuery = "SELECT count(*) FROM aspnet_Users where Username=@uname AND Password = @pwd";
    using(SqlConnection sqlConnection = new SqlConnection(strConnection))
    using(SqlCommand command = new SqlCommand(SQLQuery, sqlConnection))
    {
        sqlConnection.Open();
        command.Parameters.AddWithValue("@uname", Username);
        command.Parameters.AddWithValue("@pwd", Password);
        int result = Convert.ToInt32(command.ExecuteScalar());
        boolReturnValue = (result > 0);
    }

这里我需要一些额外的信息,如果上面的用户名和密码是正确的, 我需要的是:用户名和角色列数据

【问题讨论】:

  • 我确实希望您在密码存储中使用某种形式的散列,而不仅仅是纯文本(并且使用适当的散列不仅仅是通过 sha256 一次,可以在彩虹表或其他数据库),你不说如果你不是,我只是想检查你是。

标签: c# asp.net sql sql-server-2008


【解决方案1】:

为什么你不这样做呢?

string SQLQuery = "SELECT UserId FROM aspnet_Users where Username=@uname AND Password = @pwd";
[...]
object result = command.ExecuteScalar();
if (result == null)
{
    boolReturnValue = false;
}
else
{
    long userId = Convert.ToInt64(result);
    boolReturnValue = true;
}

【讨论】:

  • 如果我需要表中的 2 个值怎么办?假设我需要 UserId 和 LastActiveDate
  • 您需要使用 command.ExecuteReader() 而不是 command.ExecuteScalar() ExecuteReader() 将返回一个 SqlDataReader,您需要对其进行迭代。 @Alireza:command.Parameters.AddWithValue 不检查 SQL 注入?
  • @Falydoor 哎呀!你说的对。我没有注意到传递的参数没有被连接。对不起
【解决方案2】:
String SQLQuery = "SELECT Top 1 UserId, role  FROM aspnet_Users where Username=@uname AND Password = @pwd";
    using(SqlConnection sqlConnection = new SqlConnection(strConnection))
    using(SqlCommand command = new SqlCommand(SQLQuery, sqlConnection))
    {
        sqlConnection.Open();
        command.Parameters.AddWithValue("@uname", Username);
        command.Parameters.AddWithValue("@pwd", Password);

         SqlDataReader Reader = null;
         if (sqlConnection.State == ConnectionState.Closed || sqlConnection.State == ConnectionState.Broken)
                    sqlConnection.Open();
            Reader = command.ExecuteReader();
           if (Reader.Read())
          {
            int UserId = Convert.ToInt32(Reader["UserId"]);
            string Role = Convert.ToString(Reader["role"]);

          }

   }

【讨论】:

    【解决方案3】:

    您为什么不直接获取 UserId 而不是 Count(*),这样您的查询应该如下所示:

    SELECT UserId FROM aspnet_Users where Username=@uname AND Password = @pwd
    

    用户名应该是唯一的,因此您不应检索超过一行...您可以添加前 1 以防您有多个相同的用户名和相同的密码。

    【讨论】:

    • 你能否重写我的代码以获得完美答案,我正在检查用户名和密码以获取登录详细信息,如果登录成功,我需要用户 ID :)
    【解决方案4】:

    试试这个代码

    SELECT count(*),userid,role FROM aspnet_Users where Username=@uname AND Password = @pwd Group by userid,role 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多