-4

Studentname:当用户输入Id或name并单击按钮时,应该显示详细信息....如何?

这里我的 OR 子句在 select 语句中不起作用:

public partial class StudentView : System.Web.UI.Page
{
    SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["DBCS"].ConnectionString);

    protected void Button1_Click(object sender, EventArgs e)
    {

        string str = "SELECT Registration.UsrFLname, Registration.UsrAddress, Students.STUID, Materials.BookID, Materials.BookName, Courses.CourseName, Courses.CourseFee FROM Courses INNER JOIN Materials ON Courses.BookID = Materials.BookID INNER JOIN Students ON Courses.STUID = Students.STUID AND Materials.STUID = Students.STUID INNER JOIN Registration ON Students.STUID = Registration.STUID AND Registration.UsrFLname = '" + TextBox1.Text + "' OR Students.STUID = '" + TextBox1.Text + "'";

        con.Open();
        SqlCommand cmd = new SqlCommand(str, con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds, str);
        GDStudents.DataSource = ds;
        GDStudents.DataBind();
    }
}

谁能帮忙解决这个问题!!

预先感谢!!

4

2 回答 2

0

AND具有比 更高的优先级OR

在布尔逻辑AND中,就像乘法和OR求和一样,因此,当您希望求和在乘法之前发生时,您应该使用括号()

IE

2*3+1 = 7
2*(3+1) = 8

我想在你的情况下,条件应该是

Students.STUID = Registration.STUID 
   AND 
( -- note this paren
    Registration.UsrFLname = '" + TextBox1.Text + "' 
        OR
    Students.STUID = '" + TextBox1.Text + "'"
) -- note this paren

正如许多人所指出的,您应该参数化您的查询,并且不要注入最终用户提供的文本。

于 2013-06-20T16:26:19.843 回答
0

要回答您的问题,您没有得到预期的结果,因为您没有正确分组布尔运算,X AND Y OR Z当您的意思是X AND (Y OR Z). 在前者的情况下,只有 Z 或 X 和 Y 的组合需要为真,才能使整个表达式计算为真。

另一方面,您这里的代码很容易受到SQL 注入攻击,这是非常糟糕的。您应该将其切换为参数化查询posthaste。

于 2013-06-20T16:32:56.967 回答