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

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

4

3 回答 3

1

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

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

您对 if 的检查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。

于 2013-05-22T00:29:21.777 回答
1

我尝试使用以下代码。从原始数据表中删除记录后,在索引处出现异常 no row ,只是因为它从表中删除了行,并且计数器将进入原始表的行数,因此您需要实现一些算法来控制从数据表中删除记录时循环的计数器长度,它不会影响复制版本。

    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();
于 2013-05-22T05:29:05.627 回答
0

尝试复制每个值,例如

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

将行从数据表复制到另一个数据表 c-sharp

于 2013-05-28T07:06:18.180 回答