学生名:当用户输入身份证或姓名并点击按钮时,应该显示详细信息....如何?
这里我的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();
}
}
任何人都可以帮忙解决这个问题!!
提前感谢!!
答案 0 :(得分:0)
AND
的优先级高于OR
。
在布尔逻辑中AND
就像乘法,OR
就像求和,因此,当你想在求和之前发生求和时,你应该使用括号()
。
即
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
正如很多人所说,你应该参数化你的查询,不要注入最终用户提供的文本。
答案 1 :(得分:0)
要回答你的问题,你没有得到你期望的结果,因为你没有正确地对你的布尔运算进行分组,你的意思是X AND Y OR Z
X AND (Y OR Z)
。在前者的情况下,只有Z或X和Y的组合需要为真,以便整个表达式评估为真。
另外,您在这里的代码全开到SQL injection攻击,real bad。您应该将其切换为parameterized query posthaste。