为什么在截断原始文件时会截断DataTable副本?

时间:2013-05-21 23:54:20

标签: c# asp.net sql

我正在尝试保留原始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();
}

它们都显示相同的行数,即使副本应该高很多。

3 个答案:

答案 0 :(得分:1)

我不知道您在take设置的位置和位置,但在循环之前,您正在检查行数是否大于take,然后设置i = take在你的for循环中。如果take与行数相同,则不会删除任何行。

这看起来像是你的罪魁祸首,我建议你逐步完成代码并验证你的dt.Rows[i].Delete();是否会触发断点。

您检查dt.Rows.Count > take是否有点多余。您的for循环已经限制了需要删除的正确行数。根据{{​​1}}的设置,可能是检查失败。

修改 实际上看一下你的代码,我想我意识到你犯了错误

你想要这样的东西:

take

不确定是否应该只是删除第一项,但希望这会让你走上正确的轨道,以便能够删除你的行。

编辑2: 我已经更新了for循环,因为它被捕获后应该反向移除项目。谢谢@YuriyGalanter。

答案 1 :(得分: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();

答案 2 :(得分:0)

尝试复制每个值,如

copyDt = dt.Clone();
foreach(DataRows row in dt.Rows)
{
    copyDt.Rows.Add(row.ItemArray);
}

copy-rows-from-datatable-to-another-datatable-c-sharp