2009-05-04 3 views
2

Что рекомендуетсяДолжен ли AcceptChanges() вызываться каждый раз, когда добавляется новая строка?

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 помещается.


EDIT 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; 
     } 
    } 
} 

EDIT 2
После прочтения статьи MSDN here я решил поместить AcceptChanges () вне цикла на основе следующих s (из статьи):

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

+0

Что такое ваш настольный объект? – JoshBerke

+0

Какова стоимость AcceptChanges? Это нулевая стоимость? Тогда это не имеет значения? Если стоимость AcceptChanges отлична от нуля (т. Е. Требуется время, делает I/O или что-то еще), тогда это имеет значение. –

ответ

1

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

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

+0

Я обновил сообщение. –

+0

Выполнение этого действия должно быть более эффективным; однако после чтения MSDN. Я не уверен, что вам даже нужно вызвать этот метод. – JoshBerke

1

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

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

+0

Я думал об этом, однако я не знаком с AcceptChanges(), поэтому не уверен, что он должен идти внутри цикла или вне цикла. У вас есть точка с потерей данных. –

1

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

5

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

+0

Из моего понимания, AcceptChanges отмечает данные, представляющие интерес, как «Без изменений», поэтому, если вы меняете данные в наборе данных, а затем вызываете dataSet.AcceptChanges, который будет отмечать все данные как неизменные, а затем, наконец, вызывать обновление, тогда никаких изменений не будет однако, я не вижу полезности AcceptChanges? Не могли бы вы привести подробный пример? – user1338998

0

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

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

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

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

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

Смежные вопросы