首页 > 代码库 > MVC中的Ajax与增删改查(二)

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

 

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