为什么当原始数据被截断时,数据表副本会被截断

本文关键字:数据表 副本 为什么 原始数据 | 更新日期: 2023-09-27 18:14:38

我试图保留原始数据表的副本,同时试图截断原始数据表用于另一个目的。但是当我截断原始内容时,副本也会被截断。

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();
}

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

为什么当原始数据被截断时,数据表副本会被截断

我不知道你设置take的位置或内容,但就在你的循环之前,你正在检查你的行数是否大于take,然后在for循环中设置i = take。如果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();

不确定take是否应该只删除第一个项目,但希望这将使您能够正确地删除您的行。

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

我尝试了下面的代码。在从原始数据表中删除记录后,索引处没有行,只是因为它从表中删除了行,计数器将变为原始表的行数,所以你需要实现一些算法来控制从数据表中删除记录时循环的计数器长度,它不会影响复制版本。

    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();

尝试像

那样复制每个值
copyDt = dt.Clone();
foreach(DataRows row in dt.Rows)
{
    copyDt.Rows.Add(row.ItemArray);
}

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