文章出處

  上一篇記錄的是前臺操作,下面寫一下后臺 ,本來自認為是沒有必要做補充,畢竟思路啥的都有,實際上在做刪除操作的時候,折騰了一天,還是自己太嫩,邏輯不夠嚴謹,這里作下記錄。

   關于表結構這里再作下說明: 

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

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()