如何在C#asp.net中获取DataTable Row的价值

时间:2017-01-19 08:24:36

标签: c# asp.net sql-server

我自己用asp.net学习c#,我遇到了DataRows的问题, 在db中我有users表,并且isadmin列的值为int, 我想将用户重定向到不同的页面,管理员重定向到管理页面,但问题是所有用户都重定向到管理页面。

这是我的代码;

 protected void btnLogin_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(conString);
        conn.Open();
            SqlCommand cmd = new SqlCommand("SELECT username, pass FROM users 
                                where username = '"+txtUser.Text+"'
                                and pass='"+txtPass.Text+"'"
                                , conn);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        SqlCommand cmd1 = new SqlCommand("Select username, isadmin From users", conn);
        SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
        DataTable dt1 = new DataTable();
        da1.Fill(dt1);

        conn.Close();
        if (dt.Rows.Count > 0)
        {
            Session["id"] = txtUser.Text;
            if (dt1.Rows[0]["isadmin"].ToString() == "1")
            {
                Response.Redirect("~/admin.aspx");
            }
            else
            {
                Response.Redirect("~/default.aspx");
            }


            //Response.Redirect("~/default.aspx");

            Session.RemoveAll();
        }
        else
        {
            lblMsg.ForeColor = System.Drawing.Color.Red;
            //lblMsg.Text= msg ;

                /*Response.Write("<script>
                alert('Please enter valid Username and Password')
                </script>"); */
        }

你能告诉我有什么问题吗?

5 个答案:

答案 0 :(得分:3)

将第一个查询与dt一起使用,因为它基于单个用户。问题是dt1获取所有用户,该数据表中的第一条记录是管理员

if (dt.Rows[0]["isadmin"].ToString() == "1") {

使用dt1删除第二个查询,并确保将 isadmin 添加到第一个SQL查询。

SqlCommand cmd = new SqlCommand("SELECT username, pass, isadmin FROM users where username = @UserName and pass= @Pass", conn); 

看看我如何使用参数化的用户名和密码,即防止SQL注入,请务必阅读!!!

答案 1 :(得分:0)

您的代码有几个问题:

  1. 由于您在错误查询中检查isAdmin,所有用户都被重定向到管理页面。 您的第二个查询没有where子句,这意味着它将返回表中的所有用户。它返回的第一个用户的isAdmin值为1 您实际上不需要两个查询,只需一个。

  2. 您必须使用参数化查询,否则您将对documentation攻击敞开大门。

  3. 将所有IDisposable个实例包装在SQL injection语句中。

  4. 您的代码应该更像这样:

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        using(SqlConnection conn = new SqlConnection(conString))
        {
            using(SqlCommand cmd = new SqlCommand("SELECT username, pass, isadmin FROM users where username = @UserName and pass=@Pass", conn))
            {
                cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = txtUser.Text;
                cmd.Parameters.Add("@Pass", SqlDbType.VarChar).Value = txtPass.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }   
    
        }
        if (dt.Rows.Count > 0)
        {
            Session["id"] = txtUser.Text;
            if (dt1.Rows[0]["isadmin"].ToString() == "1")
            {
                Response.Redirect("~/admin.aspx");
            }
            else
            {
                Response.Redirect("~/default.aspx");
            }
    
    
            //Response.Redirect("~/default.aspx");
    
            Session.RemoveAll();
        }
        else
        {
            lblMsg.ForeColor = System.Drawing.Color.Red;
            //lblMsg.Text= msg ;
    
            //Response.Write("<script>alert('Please enter valid Username and Password')</script>");
        }
    
    }
    

答案 2 :(得分:0)

请试试这个

protected void btnLogin_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(conString);
    conn.Open();
    SqlCommand cmd =
        new SqlCommand(
            "SELECT username, pass, isadmin FROM users where username = '" + txtUser.Text + "' and pass='" + txtPass.Text +
            "'", conn);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);

    conn.Close();
    if (dt.Rows.Count > 0)
    {
        Session["id"] = txtUser.Text;
        if (dt.Rows[0]["isadmin"].ToString() == "1")
        {
            Response.Redirect("~/admin.aspx");
        }
        else
        {
            Response.Redirect("~/default.aspx");
        }


        //Response.Redirect("~/default.aspx");

        Session.RemoveAll();
    }
    else
    {
        lblMsg.ForeColor = System.Drawing.Color.Red;
        //lblMsg.Text= msg ;

        //Response.Write("<script>alert('Please enter valid Username and Password')</script>");
    }
}

答案 3 :(得分:0)

在您的第一个查询中,您还需要获得isadmin,并且在该结果的基础上,您可以检查它是否为1并且可以重定向到您喜欢的页面。所以它将如下:

protected void btnLogin_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection(conString);
    conn.Open();
    SqlCommand cmd = new SqlCommand("SELECT username, pass, isadmin FROM users where username = '"+txtUser.Text+"' and pass='"+txtPass.Text+"'", conn);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    conn.Close();
    if (dt.Rows.Count > 0)
    {
        Session["id"] = txtUser.Text;
        if (dt.Rows[0]["isadmin"].ToString() == "1")
        {
            Response.Redirect("~/admin.aspx");
        }
        else
        {
            Response.Redirect("~/default.aspx");
        }
        //Response.Redirect("~/default.aspx");
        Session.RemoveAll();
    }
    else
    {
        lblMsg.ForeColor = System.Drawing.Color.Red;
        //lblMsg.Text= msg ;
        //Response.Write("<script>alert('Please enter valid Username and Password')</script>");
    }
}

答案 4 :(得分:-1)

您的第二个查询缺少用户名的过滤器:

Select username, isadmin From users

无论它取出什么 - 如果第一行包含1作为IsAdmin,则所有用户都将被重定向到管理页面。