2013-05-21 118 views
1

我試圖保留原始數據表的副本,同時試圖截斷原來的另一個目的。但是,當我截斷原件時,副本也會被截斷。爲什麼在原始截斷時DataTable副本會被截斷?

using (SqlCommand cmd = new SqlCommand(sqlSelect, conn)) 
{ 
    //Set Time to minute and a half, should not take longer than that! 
    cmd.CommandTimeout = 90; 
    DataTable dt = new DataTable(); 
    DataTable copyDt = new DataTable(); 

    //Check the state of the database connection. If closed, then open it. 
    if (conn.State != ConnectionState.Open) 
     conn.Open(); 

    dt.Load(cmd.ExecuteReader()); 
    copyDt = dt.Copy(); 

    if (Session["ServiceRequestSearch"] != null) 
    { 
     ((DataTable)Session["ServiceRequestSearch"]).Clear(); 
     ((DataTable)Session["ServiceRequestSearch"]).Dispose(); 
     Session.Remove("ServiceRequestSearch"); 
    } 

    Session["ServiceRequestSearch"] = copyDt; 

    if (dt.Rows.Count > take) 
     for (int i = take; i < dt.Rows.Count; i++) 
      dt.Rows[i].Delete(); 

    dt.AcceptChanges(); 
    TextBox.Text = dt.Rows.Count + ""; 
    TextBox2.Text = ((DataTable)Session["ServiceRequestSearch"]).Rows.Count + ""; 



    //Close SQL data connection if it is still open. 
    if (conn.State != ConnectionState.Closed) 
     conn.Close(); 
} 

它們都顯示相同的行數,即使副本應該高得多。

+1

每個值你肯定行正在從原來的數據表中刪除嗎? – galford13x

+0

如果您只試圖從內存DataTable中刪除行,而不是從底層數據庫中刪除行,那麼您可能會看到使用Remove()而不是Delete()時會發生什麼情況。你也可以嘗試一些Linq代碼像foreach(var row in Rows.Cast ().Skip(take)){row.Remove(); } – sfuqua

回答

1

我不知道在哪裏或你所設置take,但你的循環之前吧,你正在檢查,如果你的行數大於take,然後設置i = take在for循環。如果take與您的行數相同,您將不會刪除任何行。

這看起來像你的罪魁禍首,我建議你逐步瀏覽你的代碼並確認你的dt.Rows[i].Delete();觸發一個斷點。

您的檢查是否dt.Rows.Count > take似乎有點多餘。您的for循環已經限制了需要刪除的正確行數。根據take的設置,它可能會失敗。

編輯: 你的代碼實際上是尋找多一些,我想,我意識到你做

錯誤你想是這樣的,而不是:

if (dt.Rows.Count > take) 
    for (int i = dt.Rows.Count - 1; i > take; i--) 
     dt.Rows[i].Delete(); 

不完全相信,如果採取的是應該只刪除第一個項目,但希望這會讓你在正確的軌道上能夠刪除你的行。

編輯2: 我已經更新for循環之後,它被捕獲的項目應該反向刪除。謝謝@YuriyGalanter。

+0

這並不能解釋爲什麼'copyDt'被截斷 –

+0

@YuriyGalanter真。但是,沒有證據表明任何實際的行都被刪除了。如果他回來說這兩個表中最初有X行,並且最後有Y行,我會繼續並刪除答案。沒有太多的信息要真正離開並查看MSDN,Copy()聽起來像對原始文件或副本所做的更改不應該影響其他文件。 – TyCobb

+0

我站好了。我被「應該有更多的行」拋棄,並沒有說明可能沒有刪除發生的事實。順便說一句,我會開始從最高行索引刪除通過'我 - ',否則*可能沒有更高的行刪除*已經刪除較低的 –

1

我試着用下面的代碼。 從原始數據表中刪除記錄後,在索引處沒有行發生異常,僅僅因爲它從表中刪除行,並且計數器將按照orinigal表的計數行數,因此您需要實施一些算法來控制從數據表中刪除記錄時循環的計數器長度,它不會影響複製版本。

DataTable dt = new DataTable(); 
    DataTable dtCopy = new DataTable(); 


    dt.Columns.Add("Test1"); 
    for (int counter = 0; counter < 10; counter++) 
    { 
     DataRow dr = dt.NewRow(); 
     dr[0] = counter.ToString(); 
     dt.Rows.Add(dr); 
    } 


    dtCopy = dt.Copy(); 

    int counterLength = 10; 
    for (int counter = 0; counter < counterLength; counter++) 
    { 
     if (Convert.ToInt32(dt.Rows[counter][0]) > 6) 
     { 
      dt.Rows[counter].Delete(); 
      counterLength--; 
     } 
    } 
    dt.AcceptChanges();