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操作

原文地址:https://www.cnblogs.com/Sientuo/p/6897750.html