Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除多个表中的多行_C#_Html_Sql_Database - Fatal编程技术网

C# 删除多个表中的多行

C# 删除多个表中的多行,c#,html,sql,database,C#,Html,Sql,Database,我在SQL数据库中有3个表: 动物状态 动物 推车 我希望能够删除动物和动物状态表中基于购物车的几个项目 所有表之间相同的是AnimalID,它是所有表中的主键,基于此,我应该删除它们。但同时,我需要为有特定电子邮件的人删除它 例如,如果我有人发电子邮件123@gmail.com这个人的车里有两个动物,一个ID为123,另一个ID为456 我需要从其他两个表中删除这两个特定的动物 我知道如何为一张桌子做这件事,但当我有几张桌子相互依赖时就不行了,这取决于具体的电子邮件,而购物车中还有其他电子邮件

我在SQL数据库中有3个表:

  • 动物状态
  • 动物
  • 推车
  • 我希望能够删除动物和动物状态表中基于购物车的几个项目

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

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

    我知道如何为一张桌子做这件事,但当我有几张桌子相互依赖时就不行了,这取决于具体的电子邮件,而购物车中还有其他电子邮件和动物

    以下是它在外部的工作原理:

    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删除动物状态:

    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;
        }
    
    根据动物ID从动物表中删除动物:

     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;
        }
    
    这个代码的问题是,所有这些只删除了一只动物,我需要删除几只。

    我曾尝试创建这样一个语句,但没有成功

    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')
    
    根据我用文字给出的示例,应该删除的部分在
    //removed
    中标记如下

    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|
    

    看看你目前的工作,你可以做几件事。您可以像您所要求的那样重写查询逻辑,但我在您的示例中没有看到主键/外键关系。因此,cascade无法处理当前的表设置方式。这是一篇关于级联删除的好文章

    所以,如果你不想重写所有东西,你可以在你的C代码中完成所有这些。你所要做的就是在购物车表中循环,并获取所有包含电子邮件的id“123@gmail.com“并调用您的三个delete语句。您只需要编写一个方法来获取id,并调用delete方法,直到id变量为空


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

    样本数据和期望的结果将非常有用。请展示您尝试的内容,以便我们对其进行评论或改进。还要注意的是,堆栈溢出不是“为我编写代码”服务。最后,哪个数据库管理系统:Oracle?Sql Server?MySql?etc etc在显示表的图片时对数据进行采样?您是否考虑了引用完整性(即带有级联删除的“外键”)?