2013-05-21 117 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();