2013-06-20 38 views
-4

Studentname:當用戶輸入Id或名稱並單擊按鈕時,詳細信息應該顯示....如何?在Select語句中結合「AND」或「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(); 
    } 
} 

誰能請在這個問題上幫助!

預先感謝!!

+3

定義「不工作」。此外,您在此代碼中有SQL注入安全漏洞。 – JohnFx

+1

爲了上帝的愛,請使用參數化查詢! – Lloyd

+3

另外,您是否在鍵盤上找到了Enter/Return鍵?你有沒有聽說過SQL注入? –

回答

0

AND具有比OR更高的優先級。

在布爾邏輯AND就像乘法,OR就像求和,因此,當你想在求和之前發生乘法時,應該使用括號()

I.e.

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 

正如許多人所指出的,你應該參數的查詢,不注射由最終用戶提供的文本。

+0

它的工作!非常感謝先生! – user72

+0

@蘇古。如果有幫助,請閱讀 - > http://stackoverflow.com/help/someone-answers –

0

要回答你的問題,你沒有得到你期待的結果,因爲你沒有正確地分組你的布爾操作,當你的意思是X AND (Y OR Z)時,你有X AND Y OR Z。在前者的情況下,只有Z或者X和Y的組合需要爲真才能使整個表達式評估爲真。

在另一個註釋中,您在此處的代碼是開放的SQL injection的攻擊,這是real bad。你應該把它改爲parameterized query posthaste。