Должен ли AcceptChanges () вызываться каждый раз, когда добавляется новая строка? - PullRequest
3 голосов
/ 04 мая 2009

Что рекомендуется

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

Обратите внимание, где находится таблица. 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 здесь , я решил разместить AcceptChanges () вне цикла, основываясь на следующем утверждении (из статьи):

Вызов AcceptChanges на уровне DataTable вызывает метод AcceptChanges для каждого DataRow.

Ответы [ 5 ]

6 голосов
/ 05 декабря 2012

Вызов AcceptChanges после добавления новой строки фактически превратит DataRowState недавно добавленного DataRow с Added в Unchanged. Если вы пойдете с этим, вы можете потерять отслеживание ваших недавно добавленных строк и во время сохранения. ADO.NET не сможет определить строки, которые необходимо вставить в базу данных. Поэтому выбирайте эту опцию с умом, даже не требуя ее.

1 голос
/ 04 мая 2009

Я предполагаю, что AcceptChanges когда вы фактически фиксируете свои данные?

Первый способ в этом случае менее эффективен, чем второй, но безопаснее, поскольку вероятность потери данных в случае прерывания чтения в некоторый момент меньше.

1 голос
/ 04 мая 2009

Вы уверены, что вам нужно вообще вызывать метод AcceptChanges? Я делал подобное, и мне никогда не приходилось им пользоваться.

1 голос
/ 04 мая 2009

Это действительно зависит от того, что является вашим табличным объектом и что делает AcceptChanges. В целом, я бы сказал, что подход secodn более эффективен, если вы можете вызвать AcceptChanges только один раз и заставить его работать.

Опять же, это вообще потому, что я не знаю, с каким объектом вы на самом деле имеете дело. Но делать вещи внутри циклов обычно дороже, потому что вы делаете это чаще, но ваш табличный объект может потребовать, чтобы вы принимали изменения между каждой строкой, и в этом случае у вас нет выбора.

0 голосов
/ 14 января 2014

Вы звоните, чтобы принять изменения в таблице, но имейте в виду, что вы можете вызвать acceptchanges для каждой отдельной строки, таким образом влияя только на эту строку.

dsDataset.Tables [ "OrderSummary"] Строки [currentrow] .acceptchanges ();.

Это действительно зависит от того, что вы пытаетесь сделать. Вы можете обновить все в конце таблицы или индивидуально в каждой строке.

Также имейте в виду, что вызовы, принимающие таблицы, изменят состояние данных на неизменное. Таким образом, если вы пытаетесь обновить базу данных (SQL, Access, ect ...), это может помешать обновлениям базы данных.

Из вашего примера видно, что вы используете эту таблицу только для отчета, поэтому не уверены, зачем вам вообще нужно обновлять состояние datarowstate. Не уверен, что отчет заботится. Насколько я знаю, acceptchanges / datarowstate касается только обновления бэкэнда.

...