2011-05-22 37 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

相关问题