每次添加新行时都应该调用AcceptChanges()吗?

时间:2009-05-04 19:16:16

标签: .net optimization datatable dataset

推荐哪个

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方法。

5 个答案:

答案 0 :(得分:6)

添加新行后调用AcceptChanges实际上会将新添加的DataRowState的{​​{1}}从DataRow转为Added。如果你使用它,你可能丢失新添加的行的跟踪并且在持续时。 ADO.NET 将无法识别需要插入数据库的行。因此,明智地选择此选项,甚至可能不需要它。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

第一种方式在这种情况下效率低于第二种方式,但是更安全,因为如果您的读取在某些时候被中断,则丢失数据的可能性更小。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您正在调用表上的接受更改,但建议您可以在每个行上调用acceptchanges,从而仅影响该行。

dsDataset.Tables [ “OrderSummary”]行[currentrow] .acceptchanges();

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

还要记住,调用表accept更改它会将datarowstate更改为不变。因此,如果您尝试更新数据库(SQL,Access,等等),那么可能会干扰数据库更新。

从您的示例中可以看出,您只是将此表用于报表,因此不确定为什么需要更新datarowstate。不确定报告是否关心。据我所知,acceptchanges / datarowstate只涉及更新后端。