2011-10-24 96 views
0
private void d_Load(object sender, EventArgs e) 
    { 

     string connstring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\it155.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; 
     SqlConnection conn = new SqlConnection(connstring); 
     try 
     { 
      conn.Open(); 

      string snumber = txtSnumber.Text; 
      SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber ='" + txtSnumber.Text + "'", conn); 

     } 
     catch (Exception) 
     { 

     } 
    } 

給出上面寫的代碼的開始,我打算做的是能夠在sql數據庫中使用id號數據類型varchar(11)登錄,該數據庫要在txtSnumber中輸入,但是在旁邊我無法弄清楚如何檢查輸入的ID號碼是否正確,如果正確,對應於該ID號碼的信息應該顯示在它們對應的文本框中。請幫幫我,謝謝有陷阱,如何登錄?

+0

我強烈建議你刪除try/catch塊。它會讓你忽略所有的例外,這不是你想要做的。 –

回答

1

您可以通過使用DataReader()

SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber ='" + txtSnumber.Text + "'", conn); 
    SqlDataReader myReader = get.ExecuteReader(); 
    if (myReader.HasRows) 
    { 
    MessageBox.Show("ID is valid"); 
    while (myReader.Read()) 
     //Do something here   
    } 
    else 
    MessageBox.Show("Given ID is Invalid."); 

編輯檢查:

雖然喊你把下面的參數裏面的ExecuteReader()方法,這樣,當你永遠關閉數據讀取器的連接也會自動關閉。

SqlDataReader myReader = get.ExecuteReader(CommandBehavior.CloseConnection); 
+0

有一個錯誤,說它沒有打開。我試圖把「conn.Open();」在SqlCommand行之上,但是當你得到那個錯誤時,彈出 –

+0

仍然存在錯誤?同時從datareader或其他讀取值? –

5

您的sql語句很容易出現SQL注入。像這樣連接SQL是非常糟糕的做法。相反,做這樣的事情:現在

string snumber = txtSnumber.Text; 
SqlCommand get = new SqlCommand(@"Select from IStudent where SNumber [email protected]", conn); 

get.Parameters.AddWithValue("@User",snumber); 

,以檢查記錄是否被發現或沒有,你這樣做:

using(IDataReader reader = get.ExecuteReader()) 
{ 
     if (reader.HasRows) 
     { 
      //information correct. Do something 
     } 
} 
+0

只是爲了我的理解和好奇,您的解決方案如何使用@user和參數語句避免SQL注入?我的意思是你間接地賦予textBox值的權利? – Zenwalker

+0

@zenwalker參數自動轉義;字符串連接作爲原始文本傳遞給DBMS。使用參數化查詢有更多好處,比如執行計劃可以被緩存,而原始sql語句不能。 – Icarus

+0

int this line「get.Parameters.AddWithValue(」@ User「,snumber);」,@User應該是什麼?它是ID號碼應該寫入的文本框的名稱? –