2013-11-29 48 views
1
private void btnDel_Click(object sender, EventArgs e) 
{ 
    if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes) 
    { 
     using (SFCDataContext SFC = new SFCDataContext()) 
     { 
      var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord).Count(); 
      if (countRec > 0) 
      { 
       Systems_MonitoringMeasurementHeader Table = SFC.Systems_MonitoringMeasurementHeaders.FirstOrDefault(r => r.DocNO == DocNum.Text && r.DetailsDocNum == clsVariable.GetDocNumRecord); 
       SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(Table); 
      } 

      var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord).Count(); <-- Starts here.. 
      if (countRecDetails > 0) 
      { 
       for (int i = 0; i < countRecDetails; i++) 
       { 
        Systems_MonitoringMeasurementDetail TableDetails = SFC.Systems_MonitoringMeasurementDetails.FirstOrDefault(w => w.DocNO == DocNum.Text && w.DetailsDocNum == clsVariable.GetDocNumRecord); 
        SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(TableDetails); 
       } 
      } <-- Til here 

      SFC.SubmitChanges(); 
      SFC.Connection.Close(); 
      gfunc.setMessageBox("Delete Successful!", 2); 
      ClearFields(2); 
      btnSetLock(true, false, true, false, false, false, false, true); 
      DocNum.Enabled = true; 
      DocNum.Focus(); 
     } 
    } 
} 

問題是在刪除詳細記錄時,它確實執行刪除操作,但它只刪除一行。而不是5或更多..它只需要第一個條目。我通過調試中的引用找到的記錄的計數做出for循環語句,它顯示了記錄的確切計數。 5所以它循環刪除記錄5次,但只刪除第一個條目,其餘都沒有。爲什麼?請幫忙。如何在此代碼中刪除多行記錄

- 更新 -

if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes) 
      { 
       using (SFCDataContext SFC = new SFCDataContext()) 
       { 
        var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord); 
        if (countRec.Count() > 0) 
        { 
         SFC.Systems_MonitoringMeasurementHeaders.DeleteAllOnSubmit(countRec.ToList()); 
        } 

        var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord); 
        if (countRecDetails.Count() > 0) 
        { 
         SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(countRecDetails.ToList());       
        } 

        SFC.SubmitChanges(); 
        SFC.Connection.Close(); 
       } 
       gfunc.setMessageBox("Delete Successful!", 2); 
       ClearFields(2); 
       btnSetLock(true, false, true, false, false, false, false, true); 
       DocNum.Enabled = true; 
       DocNum.Focus(); 
      } 

它的工作原理,但我不知道它的好不好。

+0

你是否嘗試過SFC.SubmitChanges()for for循環? –

+0

@masoumehkarvar比他已經有更多的查詢? –

回答

4

您的解決方案無法正常工作,因爲您正在查詢要在循環中刪除的實體,但不會在每個步驟中提交更改。因此你得到5次完全相同的第一行(因爲數據庫在這裏沒有改變)。您將其標記爲刪除5次。然後在提交期間只刪除這一行。

而不是使兩個查詢(一個檢查,如果實體存在,以及其他負載所需的實體),可以使用單一的查詢:

var header = SFC.Systems_MonitoringMeasurementHeaders 
      .FirstOrDefault(h => h.DocNO == DocNum.Text && 
           h.DetailsDocNum == clsVariable.GetDocNumRecord); 
if (header != null) 
    SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(header); 

同樣的,多個實體(在這裏你有6個查詢,而不是一個)

var details = SFC.Systems_MonitoringMeasurementDetails 
       .Where(d => d.DocNO == DocNum.Text && 
          d.DetailsDocNum == clsVariable.GetDocNumRecord); 

foreach(var detail in details)  
    SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(detail); 

SFC.SubmitChanges(); 

請記住 - 直到您致電SubmitChanges()數據庫中沒有更新內容。如果您在不更改數據庫的情況下多次執行相同的查詢,它將返回相同的數據。

+0

大謝謝先生..我已經想出了一個解決方案,我剛剛得到它之前我已經檢查了你的答案,但我會用你的答案,而不是我的。如果你介意你可以檢查它,告訴我是否有問題,我會發布我的答案。我仍然是一名學生,正在學習這門語言的C#,所以我正在接受我收到的任何評論,以擴展這門語言的知識。 – Oblivious7

+0

@ Oblivious7順便說一句,不要在循環中添加刪除的細節,您可以像Channappa建議的那樣,通過'DeleteAllOnSubmit(details)'調用一次性添加它們。但不要使用任何()' - 這將導致查詢被執行兩次 –

+0

好的,先生..謝謝 – Oblivious7

2

我想你並沒有意識到你正在刪除第一行5次。 建議使用DeleteAllOnSubmit方法刪除多行。

var tableDetails = SFC.Systems_MonitoringMeasurementDetails.Where(
         y => y.DocNO == DocNum.Text && 
         y.DetailsDocNum == clsVariable.GetDocNumRecord); 

if(tableDetails.Any()) 
{ 
    SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(tableDetails); 
} 
+0

謝謝先生的答案.. – Oblivious7