2016-04-28 60 views
0
private void Update_Button_Click(object sender, EventArgs e) 
    { 
     ////////////////////////////////////////// Update Data //////////////////////////////////////////////////////////////////////////////////// 
     string Query = "Update Contact_List set Id='" + Id_Box.Text + "' ,Name='" + Name_Box.Text + "' ,Adress1='" + Adress1_Box.Text + "',Adress2='" + Adress2_Box.Text + "' ,City='" + City_Box.Text + "' ,Province='" + Province_Box.Text + "' ,Postal_Code='" + Code_Box.Text + "' ,Phone='" + Phone_Box.Text + "' ,Email='" + Email_Box.Text + "' where id='" + Id_Box.Text + "' ;"; 
     SqlCeCommand cmd = new SqlCeCommand(Query, con); 
     SqlCeDataReader reader; 
     try 
     { 
      con.Open(); 
      reader = cmd.ExecuteReader(); 
      MessageBox.Show("Information Updated....."); 

      while (reader.Read()) 
      { 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     con.Close(); 

這段代碼可以工作,但唯一的問題是它只在textBox中編輯具有相同Id的數據。所以,當我想編輯人員ID然後我不能因爲新的ID不在數據庫中,所以我不能編輯它。無論如何要添加「或」當你想編輯數據庫中的數據?

無論如何,在查詢中有「或」。

Algrithm:其中id = id_box.Text或者名稱= name_box.Text查詢

,這樣我可以更改編號或名稱

+7

SQL INJECTION ALERT!危險!!! –

+1

使用存儲過程 –

+0

爲什麼不檢查它是否存在,並根據該邏輯採取行動?提示:按Id查找,如果有任何記錄,更新,則添加 –

回答

1

使用參數

你不應該使用字符串連接來構建查詢,因爲它不僅會導致像SQL注入這樣的糟糕,而且會導致查詢和參數傳遞不正確。

一個更安全的方法是使用SQL參數化,它將每個值作爲參數傳遞,以確保沒有什麼不良可以通過。

添加額外的WHERE參數

至於附加一定的屬性,你的WHERE子句中,你可以做這樣明確地建立查詢時:

var query = "... WHERE Id = @Id OR Foo = @Bar"; 

或有條件地:

if(condition) 
{ 
    query += " OR Property = @Property"; 
} 

你只需要確保你是一致的,如果你在你的W中添加另一個參數HERE子句在執行查詢之前爲參數添加匹配值。

全部放在一起

這些變化的一個例子可能看起來像以下(含略去了較大的或重複部分):

private void Update_Button_Click(object sender, EventArgs e) 
{ 
    // Build your connection 
    using(var connection = new SqlCeConnection("{your-connection-string}")) 
    { 
     // Build your query 
     var query = "UPDATE Contact_List SET ID = @Id, Name = @Name, Adress1 = @Adress1, Adress2 = @Adress2, City = @City, Province = @Province, Postal_Code = @Postal_Code, Phone = @Phone, Email = @Email WHERE ID = @Id"; 

     // If you want to append another OR statement for your WHERE clause, you could 
     // do so here 
     if(condition) 
     { 
      query += " OR Property = @Property"; 
     } 
     // Build your command to execute 
     using(var cmd = new SqlCeCommand(query,conn)) 
     { 
       conn.Open(); 
       // Add all of your parameters 
       cmd.Parameters.AddWithValue("@Id", Id_Box.Text); 
       cmd.Parameters.AddWithValue("@Name",Name_Box.Text); 

       // Tons of others omitted for brevity 

       // Check for your other WHERE condition property 
       if(condition) 
       { 
        // Add your parameter to match your clause 
        cmd.Parameters.AddWithValue("@Property","{your-value}"); 
       } 
       // Do your thing here 
       using(var reader = cmd.ExecuteReader()) 
       { 
        // Omitted for brevity 
       } 
     } 
    } 
} 
+0

最重要的是,我建議將SQL代碼移到它自己的數據抽象類中,而不是將它放在正確的位置按鈕事件處理程序。 – theMayer

+0

我和你在一起,特別是如果它經常使用(閱讀爲「不止一次的地方」)。我可能應該完全放棄實際的事件處理程序代碼,以使代碼示例不與該方法「綁定」。 –

+0

是的,你永遠不希望通過代碼來查找表X引用的位置。 – theMayer

相關問題