2011-05-22 35 views
0

我有兩個表:Accounts(其中包含用戶擁有的帳戶信息)和AccountUsers,其中包含上述Accounts表中的帳戶的用戶列表。如何從單個查詢中的兩個表中刪除數據

如果我必須刪除一個用戶,那麼我將不得不從兩個表中刪除它們,因爲AccountUsers將有一行該用戶,其他可能有很多,因爲單個用戶可以有多個帳戶。

我寫了下面的代碼,可以很好地工作,並從兩個表中刪除行,但是每當第二個表中有多行時,它們都無法刪除它們,並且ExecuteNonQuery()返回0,這意味着0行受到影響。

我想知道它是否可以在一行中完成。另外,如何爲第二個表中的多行執行操作,因爲我現有的代碼只在有單行時纔有效。

代碼:

public static bool DeleteUser(int UserId) 
     { 
      if (ConnectDatabase()) 
      { 
       sql_cmd = new SqlCommand(); 
       sql_cmd.Connection = sql_con; 
       sql_cmd.Parameters.Add("@userId", SqlDbType.Int).Value = UserId; 
       sql_cmd.CommandText = "DELETE FROM AccountsUsers WHERE Id = @userId"; 

       if (sql_cmd.ExecuteNonQuery() == 1) 
       { 
        sql_cmd = new SqlCommand(); 
        sql_cmd.Connection = sql_con; 
        sql_cmd.Parameters.Add("@userId", SqlDbType.Int).Value = UserId; 
        sql_cmd.CommandText = "DELETE FROM Accounts WHERE userId = @userId"; 
        if (sql_cmd.ExecuteNonQuery() == 1) 
        { 
         return true; 
        } 
        else 
         return false; 

       } 
       else 
        return false; 
      } 
      else 
       return false; 
     } 

回答

2

你的代碼中存在一些邏輯缺陷。它在第二個表中有一條記錄,ExecuteNonQuery將返回1,但它有更多的,它會不是返回一個,但一些其他的數字。我會改變後的第二個條件上刪除對:

if (sql_cmd.ExecuteNonQuery() > 1) 

這就提出了一個問題 - 如果在第二個表中沒有記錄,你想你的函數返回false?

+0

這是你告訴的錯誤。實際上它返回2當它刪除兩行等。我從來沒有想到它,我想那裏只有2個值 – 2011-05-22 01:24:51

2

你可能需要先刪除帳戶,但它究竟是不是清楚你的外鍵會向哪個方向

你不能從兩個表中刪除單個查詢一般來說,但是您可以創建一個事務並在事務中有兩個DELETE語句。

您還可以使用級聯刪除約束,以便您只從父表中刪除(但我很少推薦)。

+1

在MySQL中,你可以。 '刪除帳戶用戶,帳戶 使用帳戶用戶內部加入帳戶 WHERE AccountsUsers.Id = Accounts.userId AND AccountsUsers.Id = @ userId' – silverfox 2011-05-22 01:14:44

+0

in'Accounts'table有主鍵名爲Id,但我使用的是userId列,這是我填充列時,我插入數據庫表中的值。 – 2011-05-22 01:15:53

+0

它可以是SQL中的圓頂嗎? – 2011-05-22 01:16:33

2

我可能過於簡單,但你可能只是做以下 - 沒有什麼錯,包括用分號分隔的單個命令多個SQL語句:

static bool DeleteUser(int UserId) 
    { 
     if (ConnectDatabase()) 
     { 
      sql_cmd = new SqlCommand(); 
      sql_cmd.Connection = sql_con; 
      sql_cmd.Parameters.Add("@userId", SqlDbType.Int).Value = UserId; 
      sql_cmd.CommandText = "DELETE FROM Accounts WHERE userId = @userId;DELETE FROM AccountsUsers WHERE Id = @userId;"; 

      if (sql_cmd.ExecuteNonQuery() == 1) 
      { 
       return true; 
      } 
      else 
       return false;    
    } 

據說這是絕對的最佳實踐在AccountsUsers之前首先從Accounts表中刪除,因爲通常Accounts表在AccountsUsers表上會有一個外部約束。這意味着在帳戶中相應的行先刪除之前,AccountsUsers中不能刪除行。

+0

Yeh的工作,但我沒有得到它的問題是'史蒂夫馬洛裏'告訴 – 2011-05-22 01:28:29

相關問題