上一篇記錄的是前臺操作,下面寫一下后臺 ,本來自認為是沒有必要做補充,畢竟思路啥的都有,實際上在做刪除操作的時候,折騰了一天,還是自己太嫩,邏輯不夠嚴謹,這里作下記錄。
關于表結構這里再作下說明:
①表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操作
文章列表