-1

我想在用户从数据库进入时选择相应的用户部门并将用户发送到相应的页面

SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Projects\\csharp\\Drawing\\App_Data\\Drawing.mdf;Integrated Security=True;User Instance=True");

SqlCommand cmd;
SqlDataReader dr;

protected void Button1_Click(object sender, EventArgs e)
{
    conn.Open();
    cmd = new SqlCommand("Select * from userstable where Name ='" + TextBox1.Text + "'and Password='"+TextBox2.Text+"'", conn);

    dr = cmd.ExecuteReader();

    if (!dr.Read())
    {
        Response.Write("User name or password Incorrect");
    }
    else {

          \\I have a column for department in my database how to select it(it has 4 separate departments)
    }

4

3 回答 3

3

我认为这就是你要找的:

else {

      var department = dr["DepartmentNum"].ToString();
      if(department=="01")
       Response.Redirect("SomePage.aspx");
      else if(department=="04")
        //... etc.
}

上面的代码假设您的用户表中有一个名为“DepartmetNum”的列。另请注意,这样做select *不是一个好习惯。您应该明确说明您打算选择哪些列,仅此而已。

最重要的是,您的代码容易受到 SQL 注入攻击,因为您通过简单地连接字符串来构建 SQL 语句。恶意用户可以制作有效查询,例如,删除整个数据库。

相反,编写参数化查询。谷歌他们。

using (SqlCommand cmd = new SqlCommand("Select DeparmentNUm from userstable where Name = @Name and Password = @Password", conn))
 {
     cmd.Parameters.AddWithValue("@Name",txtBox1.Text);
     cmd.Parameters.AddWithValue("@Password",txtBox2.Text);
     //...
 }
于 2013-06-01T07:04:27.667 回答
0

要回答您的问题:

var deptId = dr.GetInt32(dr.GetOrdinal("department"));

(假设您的部门列称为“部门”)。


但请注意,您的代码中还应修复其他各种问题:

  • 不要将用户输入复制到 SQL 字符串中。这很容易出错并且存在安全漏洞(SQL 注入)。请改用参数化 SQL
  • Dispose其类实现的对象IDisposable。最简单的方法是使用using语句。在您的示例中,这包括数据库连接、命令和数据读取器。¹

以下是有关如何解决这些问题的示例:

protected void Button1_Click(object sender, EventArgs e)
{
    using (SqlConnection conn = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=D:\\Projects\\csharp\\Drawing\\App_Data\\Drawing.mdf;Integrated Security=True;User Instance=True"))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("Select * from userstable where Name = @Name and Password = @Password", conn))
        {
            cmd.Parameters.AddWithValue("@Name", TextBox1.Text);
            cmd.Parameters.AddWithValue("@Password", TextBox2.Text);

            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                if (!dr.Read())
                {
                    Response.Write("User name or password Incorrect");
                    return;
                }

                var deptId = dr.GetInt32(dr.GetOrdinal("department"));
                // do something with deptId
             }
         }
     }
}

¹您将侥幸不释放 SqlCommand,因为这本质上是一个无操作,但不释放(或关闭)SqlDataReader 将阻止您要在连接上执行的任何其他操作。

于 2013-06-01T07:03:48.410 回答
0

我想提出以下想法

选项1

  • 第 1 步:为部门创建一个页面,例如 DepartmentDashboard.aspx
  • 第 2 步:在 else 部分,传递部门名称或 id 或您必须在查询字符串中区分部门的任何值。
  • 第三步:解析DepartmentDashboard.aspx加载事件中的查询字符串值,并相应显示内容

选项 2(更安全的方式,使用户不会知道部门 ID)

  • 第 1 步:为部门创建一个页面,例如 DepartmentDashboard.aspx
  • 第 2 步:在 else 部分,保留部门名称或 id 或任何值,以区分用户会话中的部门。代码如下所示。

    Session["department_id"] = [这里传递部门id];

  • 步骤 3:从 DepartmentDashboard.aspx 的加载事件中的会话变量中检索值并相应地显示内容

于 2013-06-01T07:14:23.720 回答