• MVC中的Ajax与增删改查(二)


      上一篇记录的是前台操作,下面写一下后台 ,本来自认为是没有必要做补充,毕竟思路啥的都有,实际上在做删除操作的时候,折腾了一天,还是自己太嫩,逻辑不够严谨,这里作下记录。

       关于表结构这里再作下说明: 

       ①表A是三个联合主键,key1,key2,...  

       ②表B是四个联合主键 key1,key2,key3,...

       ③A表主键是B表外键

       ④A,B表的某个栏位的描述信息都来自语言表C

       ⑤C表联合主键(TableName,TableKey,Language,Desc,...)

       ⑥如果记录A表描述信息: TableKey为(key1,key2)

      删除从表B 时,需要删除B+C  将SQL拼接在一起,删除失败立即回滚

    //刪除
    public bool Delete_Detail(List<string> keyList)
    {
      try
      {
        string strall = "";
        //循環刪除數據
        for (int i = 0; i < keyList.Count; i++)
        {
          //刪除B表
          string strsqlb = @" DELETE FROM B WHERE key1='" + keyList[i].Split(',')[0] + "' AND  key2='" + keyList[i].Split(',')[1] + "' AND key3='" + keyList[i].Split(',')[2] + "' ";
          //刪除C表
          string strsqlc = @" DELETE  FROM C WHERE TableName ='B' AND TableKey='" + keyList[i] + "' ";
    
          strall += (strsqlb + strsqlc);
                       
        }
        //調用事務
        return base.ExecuteNonQueryWithTran(strall) > 0;
      }
      catch (Exception ex)
      {
        return false;
      }
    }

    同理,在删除A表时,就需要多做一点处理,试想,因为涉及主外键关系,当删除多笔A表中数据时,可能其中的一笔或者多笔在从表B中存在,这时,就要提前删除B,如果采用SQL 拼接的话,执行事务时,由于外键的原因,中途会因为约束而中断。所以正常逻辑是: 先判断B表是否存在,不存在忽略,存在则立即删除

     //刪除
     public bool Delete_A(List<string> keyList)
     {
          try
          {
                //循環刪除數據
              string strall = "";           
              for (int i = 0; i < keyList.Count; i++)
              {
                 bool b = IsExistB(keyList[i].Split(',')[0], keyList[i].Split(',')[1],"");
                 if (b)
                 {
                    //刪除從表 B
                    string strsqlb = @" DELETE FROM  B WHERE key1='" + keyList[i].Split(',')[0] + "' AND  key2='" + keyList[i].Split(',')[1] + "' ";
                    base.ExecuteNonQuery(strsqlb);
                 }                   
                 //刪除主表 A
                 string strsqla = @" DELETE FROM  A WHERE key1='" + keyList[i].Split(',')[0] + "' AND  key2='" + keyList[i].Split(',')[1] + "' ";
                 //刪除語言表 C
                 string strsqlc = @" DELETE  FROM C WHERE TableName= 'A' AND TableKey in('" + keyList[i] + "') ";
    
                 strall += (strsqla + strsqlc);                   
              }
              //調用事務
              return base.ExecuteNonQueryWithTran(strall) > 0;
          }
          catch (Exception ex)
          {
              return false;
           }
    }

    以上是关于删除逻辑,此外新增这里,同理,每当新增一笔A/B记录时,都要在C表做对应的新增操作

    新增A: 判断A表是否存在此记录,如果存在,返回no;不存在,执行新增A、C操作

    新增B亦是如此

    之前是按照这种思路做操作,如果存在这种情况:A不存在,C存在(毕竟C没有外键约束)

    此时就要对C进行一个操作,直接删除C表对应描述,而无需判断是否存在,C存在则本应该删除(无效数据),C不存在,执行删除也不影响数据

    补充后的思路:

    判断A表是否存在此记录,如果存在,返回no;不存在,删除C,执行新增A、C操作

  • 相关阅读:
    koa mog
    sdl
    基于WindowImplBase 更简单 以及 可变大小的,才是标准的
    df
    ffplay vc
    开源1bo
    react学习前一部分
    0514 react路由
    nodejs 调用进程
    Ubuntu Linux, 不要弄什么 wine,龙井 或者什么等 QQ 了。
  • 原文地址:https://www.cnblogs.com/Sientuo/p/6897750.html
Copyright © 2020-2023  润新知