2013-06-19 109 views
2

我有我需要從表Client級聯刪除與Ado.net

public void Delete_Client(int _id_client) 
     { 
      Data.Connect(); 
      using (Data.connexion) 
      { 
       string s = "Delete From CLIENT where id_client = " + _id_client; 
       SqlCommand command = new SqlCommand(s, Data.connexion); 
       try 
       { 
        command.ExecuteNonQuery(); 
       } 
       catch { } 
      } 
     } 

Client包含對另一個表的外引用刪除行的應用程序。因此出現異常表示刪除必須是級聯的。

那麼我怎麼能改變我的代碼來做到這一點(我使用sql服務器作爲dbms)?

回答

1

IMO應避免因爲使用on delete cascade

  1. 您失去控制哪些已經被刪除
  2. 表引用已進行修改,以使其能夠
  3. 使用參數化查詢(如各地的諮詢)

因此,讓我們改變你的查詢。我添加了ClientOrder作爲示例表,它持有我們即將被刪除的客戶端的外鍵引用。 首先我刪除鏈接到客戶端的所有訂單,然後刪除客戶端本身。對於與Client錶鏈接的所有其他表 ,這應該如此。

public void Delete_Client(int _id_client) 
{ 
    Data.Connect(); 

    using (Data.connexion) 
    { 
     string query = "delete from ClientOrder where id_client = @clientId; delete From CLIENT where id_client = @clientid"; 

     SqlCommand command = new SqlCommand(query, Data.connexion); 
     command.Parameters.AddWithValue("@clientId", _id_client); 

     try 
     { 
      command.ExecuteNonQuery(); 
     } 
     catch { } //silencing errors is wrong, if something goes wrong you should handle it 
    } 
} 

參數化查詢有很多優點。首先它更安全(查看SQL注入攻擊)。第二種類型通過框架解決(特別適用於帶有格式的DateTime)。