【问题标题】:Should AcceptChanges() be called every time a new row is added?每次添加新行时都应该调用 AcceptChanges() 吗?
【发布时间】:2010-10-23 17:14:54
【问题描述】:

推荐

while (reader.Read())  
{
    table.Rows.Add(
            new object[] { reader[0], reader[1], reader[2], reader[3] }
    );  
    table.AcceptChanges();
}  

while (reader.Read())  
{
    table.Rows.Add(
            new object[] { reader[0], reader[1], reader[2], reader[3] }
    );  
}  
table.AcceptChanges();

注意 table.AcceptChanges 的放置位置。


编辑 1

这里是代码块:

protected void Page_Load(object sender, EventArgs e)
{
    IDataReader reader = cust.GetCustomerOrderSummary("99999");
    using (DataSet ds = new DataSet())
    {
        using (DataTable table =
                new DataTable { TableName = "OrderSummary" })
        {
            DataColumn idColumn = table.Columns.Add("number", typeof(int));
            table.Columns.Add("name", typeof(string));
            table.Columns.Add("quantity", typeof(int));
            table.Columns.Add("prev_quantity", typeof(int));
            table.PrimaryKey = new DataColumn[] { idColumn };
            while (reader.Read())
            {
                table.Rows.Add(
                  new object[]{ reader[0], reader[1], reader[2], reader[3] }
                );
                table.AcceptChanges();
            }
            ds.Tables.Add(table);
            rptCustomerOrder report =
                    new rptCustomerOrder { DataSource = ds };
            ReportViewer1.Report = report;
        }
    }
}

编辑 2
在阅读了 MSDN 文章 here 之后,我决定根据以下语句(来自文章)将 AcceptChanges() 放在循环之外:

在 DataTable 级别调用 AcceptChanges 会导致调用每个 DataRow 的 AcceptChanges 方法。

【问题讨论】:

  • AcceptChanges 的成本是多少?是零成本吗?那么就无所谓了吗?如果 AcceptChanges 的成本不为零(即,它需要时间、I/O 或其他什么),那么它很重要。

标签: .net optimization datatable dataset


【解决方案1】:

这实际上取决于您的表对象是什么以及 AcceptChanges 正在做什么。一般来说,如果您只能调用一次 AcceptChanges 并让它完成工作,我会说第二种方法更有效。

这也是一般情况,因为我不知道您实际处理的是什么对象。但是在循环内做事通常会更昂贵,因为你这样做的频率更高,但你的表格对象可能需要你接受每一行之间的变化,在这种情况下你别无选择。

【讨论】:

  • 以后再做,应该会更高效一些;但是在阅读了 MSDN 之后。我不确定你是否需要调用这个方法
【解决方案2】:

我假设 AcceptChanges 是您实际提交数据的时间?

在这种情况下,第一种方法比第二种方法效率低,但更安全,因为如果您的读取在某个时间点被中断,您丢失数据的可能性较小。

【讨论】:

  • 我在想这个,但是我不熟悉 AcceptChanges() 所以我不确定它应该进入循环内部还是循环外部。丢失数据是有道理的。
【解决方案3】:

您确定需要调用 AcceptChanges 方法吗?我做过类似的,我从来没有使用过它。

【讨论】:

    【解决方案4】:

    在添加新行后调用AcceptChanges 实际上会将新添加的DataRowDataRowStateAdded 变为Unchanged。如果您继续使用它,您可能失去对新添加行的跟踪,并且在持久化时。 ADO.NET 无法识别需要插入数据库的行。所以明智地选择这个选项,你甚至可能不需要它。

    【讨论】:

    • 据我了解,AcceptChanges 将感兴趣的数据标记为“未更改”,因此,如果您更改数据集中的数据,然后调用 dataSet.AcceptChanges 将所有数据标记为未更改,然后最后调用更新然后没有更改存储在数据库中,但是,我看不到 AcceptChanges 的用处?能不能给个详细的例子?
    【解决方案5】:

    您正在对表格调用接受更改,但请注意,您可以对每一行调用 acceptchanges,因此只会影响该行。

    dsDataset.Tables["OrderSummary"].Rows[currentrow].acceptchanges();

    这真的取决于你想要做什么。您可以在表格的最后更新所有内容,也可以在每一行上单独更新。

    还请记住,调用 table acceptchanges 会将数据行状态更改为未更改。因此,如果您尝试更新数据库(SQL、Access 等),那么这可能会干扰数据库更新。

    从您的示例看来,您只是将此表用于报告,因此完全不确定为什么需要更新数据行状态。不确定报告是否关心。据我所知,acceptchanges/datarowstate 只涉及更新后端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      相关资源
      最近更新 更多