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的主键都会自动递增,所以我不一定要使用那些主键。
答案 0 :(得分:0)
现在,您的存储过程正在选择所有等级。首先要做的是参数化查询,接受用户作为输入,并使用WHERE子句仅查找该学生的成绩。没有看到您的表格,我无法确切地告诉您它的外观,但例如:SELECT * FROM成绩WHERE StudentId = @StudentId;
您需要弄清的第二件事是如何获取当前用户的学生ID,然后将其传递给存储过程。同样,在没有看到您的表格的情况下,我几乎无法猜测。看来您已经具有当前用户的用户名。您是否可以运行查询以从用户名中找到studentId?如果是这样,那么您首先需要使用用户名作为参数运行该过程以获取studentId。
第三个问题与您的第一个查询有关。由于尚未对其进行参数化,因此容易受到SQL注入攻击。这带来了主要的安全风险。如果有人恶意输入用户名或密码,他们可以逃脱您要运行的SQL并删除所有表。
希望有帮助!