删除多个表中的多个行

时间:2018-06-06 11:32:01

标签: c# html sql database

我在sql数据库中有3个表

  1. 动物身份
  2. 动物
  3. 我想要做的是能够根据购物车从动物和动物状态表中删除多个项目。

    所有表之间的相同之处是AnimalID,它是所有表中的主键,并且基于我应该删除它们。但与此同时,我需要将其删除给有特定电子邮件的人。

    例如,如果我有人发送电子邮件为123@gmail.com,则此人在购物车1中有2只动物,ID为123,另一只动物为ID 456 我需要从其他两个表中删除这两个特定的动物。

    我知道如何为1张桌子做这件事,但是当我有几张桌子依赖于他们时,取决于具体的电子邮件,当购物车中还有其他电子邮件和动物时。 感谢先进的助手。

    以下是它在外面如何运作

    x= AnimalStatus.Delete(AdoptCart.GetAnimalId(Session["email"].ToString()).ToString());
                if (x > 0)
                {
                    x = Animal.Delete(AdoptCart.GetAnimalId(Session["email"].ToString()).ToString());
                    if (x > 0)
                    {
                        AdoptCart.RemoveAllbyEmail(Session["email"].ToString());
    

    以下是所有删除代码的工作顺序:

    根据动物ID

    删除AnimalStatus
    static public int Delete(string id)
        {
            int rowsAffected;
            string strSql = string.Format("delete from AnimalStatus where AnimalID='" + id + "'");
            rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
            return rowsAffected;
        }
    

    根据动物的身份

    从动物表中移除动物
     static public int Delete(string id)
            {
                int rowsAffected;
                string strSql = string.Format("delete from Animal where AnimalID='" + id + "'");
                rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
                return rowsAffected;
            }
    

    从购物车表中删除所有动物

    static public int Remove(string AnimalID) 
        {
            int rowsAffected;
            string strSql = string.Format("delete from Cart where AnimalID='" + AnimalID + "'");
            rowsAffected = (int)dataservice.ExecuteNonQuery(strSql);
            return rowsAffected;
        }
    

    这些代码的问题是,所有这些代码只会删除1个动物,因此我需要删除多个广告,因此这是错误的

    我试过创建一个声明,就像另一个已经解决的stackoverflow问题建议一样,但是我没有设法调整它以使其工作。我尝试了什么:

    Delete Animal.*, AnimalStatus.*
    
    FROM     Animal INNER JOIN
                      AnimalStatus ON Animal.AnimalID = AnimalStatus.AnimalID INNER JOIN
                      Cart ON Animal.AnimalID = Cart.AnimalID
    WHERE  (Cart.UserEmail = N'Email')
    

    根据我给出的示例,我应该删除的内容是//删除

    中标记的内容
    Cart Table
     | AnimalID | Email_Addr |
    --------------------------------------
    | 123 | 123@gmail.com | //removed
    | 456 | 123@gmail.com | //removed
    | 765 | jj@gmail.com  |
    | 343 | bb@gmail.com  |
    | 256 | cc@gmail.com  |
    
    Animal Status Table
     | AnimalID | Vaccinated |
    --------------------------------------
    | 123 | Yes | //removed
    | 456 | Yes | //removed
    | 765 | No  |
    | 343 | No  |
    | 256 | No  |
    
    Animals Tables
     | AnimalID | Age |
    --------------------------------------
    | 123 | 3 | //removed
    | 456 | 4 | //removed
    | 765 | 3 |
    | 343 | 7 |
    | 256 | 10|
    

    我想指出的是,我在同时从几个表中删除多个项目的工作知之甚少,因为这不是我们在学校学到的东西,但是我们需要我们学习它。

    还要根据我给出的建议指出我们没有学习外键,因此我不确定如何使用它们。

1 个答案:

答案 0 :(得分:0)

看看你目前的工作,你可以做一些事情。您可以像要求一样重写查询逻辑,但在您的示例中我没有看到的是主/外键关系。因此,级联将无法与您当前如何设置表格一起使用。这是一个很好的级联删除写。 Cascade Delete

因此,如果您不想重写所有内容,您可以在C#代码中完成所有这些操作。您所要做的就是遍历购物车表并获取所有具有电子邮件“123@gmail.com”的ID,并调用您的三个删除语句。你只需要编写一个方法来获取id并调用delete方法,直到id变量为空。

它只取决于您希望所有逻辑存在于sql或C#代码中的位置。如果您正在使用实体框架,无论是代码优先还是数据库优先,您都可以选择使用LINQ查询语法或扩展方法。只是取决于偏好。