我如何才能做到只有登录用户才能查看自己的成绩?

时间:2019-02-27 19:14:42

标签: c# mysql visual-studio stored-procedures mysql-workbench

This is the student info table where the student info comes from //这是用户的登录代码,它从Studentinfo表中获取用户登录信息。

private void btnlogin_Click(object sender, EventArgs e)
{
        i = 0;
        con.Open();
        MySqlCommand cmd = con.CreateCommand();

        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from stdinfotable WHERE Username='" + textuser.Text + "' and Password= '" + textpass.Text + "'";
        cmd.ExecuteNonQuery();

        DataTable dt = new DataTable();
        MySqlDataAdapter dta = new MySqlDataAdapter(cmd);
        dta.Fill(dt);

        i = Convert.ToInt32(dt.Rows.Count.ToString());

        if(i==0)
        {
            MessageBox.Show("Error");
        }
        else
        {
            this.Hide();
            StudentPage f = new StudentPage();
            f.Show();
            MySqlDataAdapter data = new MySqlDataAdapter("ViewAllGrades", con);
            data.SelectCommand.CommandType = CommandType.StoredProcedure;
            DataTable dtTable = new DataTable();

            data.Fill(dtTable);
            dtTable.Select("Last_Name");

            f.stdGrade.DataSource = dtTable;
            f.stdGrade.Columns[0].Visible = false;
        }

        con.Close();
}

这是ViewlAllGrades存储过程,其中从中返回成绩信息

 CREATE DEFINER=`root`@`localhost` PROCEDURE `ViewAllGrades`()
 BEGIN
    SELECT * 
  FROM  Grades;

  END

我正在努力做到这一点,因此只有登录的用户才能查看自己的成绩,而不是查看每个用户的成绩。所以我想知道我应该尝试在存储过程中还是在Visual Studio中进行操作,如何实现这一目标?而且我来自两个表的ID的主键都会自动递增,所以我不一定要使用那些主键。

1 个答案:

答案 0 :(得分:0)

现在,您的存储过程正在选择所有等级。首先要做的是参数化查询,接受用户作为输入,并使用WHERE子句仅查找该学生的成绩。没有看到您的表格,我无法确切地告诉您它的外观,但例如:SELECT * FROM成绩WHERE StudentId = @StudentId;

您需要弄清的第二件事是如何获取当前用户的学生ID,然后将其传递给存储过程。同样,在没有看到您的表格的情况下,我几乎无法猜测。看来您已经具有当前用户的用户名。您是否可以运行查询以从用户名中找到studentId?如果是这样,那么您首先需要使用用户名作为参数运行该过程以获取studentId。

第三个问题与您的第一个查询有关。由于尚未对其进行参数化,因此容易受到SQL注入攻击。这带来了主要的安全风险。如果有人恶意输入用户名或密码,他们可以逃脱您要运行的SQL并删除所有表。

希望有帮助!