哪个推荐

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实际上会将新添加的DataRowStateDataRowAdded变为Unchanged。如果使用它,则在持久化时可能会失去对新添加的行的跟踪。 ADO.NET将无法识别需要在数据库中插入的行。因此,明智地选择此选项,您甚至可能不需要它。

09-15 21:13