2012-01-09 2 views
0

Я хочу, чтобы это сделать:Как обновить DataRow ADO.NET в DataTable с помощью другого DataRow?

public void UpdateDataRowsToDataTable(string tableName, List<DataRow> rows) 
    { 
     foreach (DataRow row in rows) 
     { 
      // this method does not exist!! 
      _dataSet.Tables[tableName].Rows.Update(row); 
     } 
    } 

мне нужен метод, который находит ряд (может быть первичным ключом) и обновления измененных строк в строки в DataTable.

Единственная возможность, что я знаю, это использовать Select (или Find), а затем, возможно, перебрать все столбцы и дать им новые значения. Пожалуйста, скажите мне, что это не может быть правдой!

ответ

3

Хотя вопрос не совсем ясно, что это звучит, как у вас есть группа строк из одной таблицы и хотите обновить эквивалентные строки в другой Таблица данных. Если это так, вы можете просто использовать метод find и вручную обновлять их по своему усмотрению или, альтернативно, добавлять новые строки в другую таблицу и объединять их (есть всевозможные опции для объединения двух таблиц данных). Слияние, однако, будет делать то же самое под капотом (т. Е. Найти по первичному ключу и обновить столбцы).

Другим способ был бы просто заменить строку и установить его статус модифицированного datarow.SetModified()

+0

спасибо! я допускаю, что вопрос не совсем понятен. отчасти потому, что то, что я хотел сделать, было, наверное, глупо. это ответ на мой вопрос. –

1

Или вы можете удалить старый и добавить новый ...

+0

, который не решит что-либо по двум причинам: для первого: мне еще нужно найти критерии, чтобы найти его. для второго он имел бы неправильный статус строки, когда он будет возвращен в базу данных. –

+0

Если ваши новые строки не существуют в datatable, вам всегда нужно будет предоставить некоторые критерии для их поиска ... нет волшебства (слияние найдет их на основе первичного ключа). Кроме того, вы можете установить для состояния строки значение 'row.SetModified()', которое решит проблему после того, как вы перейдете для сохранения строки. –

+0

@mike: thaks. ok для части статуса, но то, что вы подразумеваете под «слиянием, найдет их на основе первичного ключа»? Теперь я понимаю из вашего ответа. так что не нужно отвечать. –

0

Не могли бы вы использовать бокс, чтобы сделать это, если ваши DataTables одинаковы.

DestDataset.DestDataTable newChildRecords = 
(DestDataset.DestDataTable)_dataset.Tables[tableName].GetChanges(DataRowState.Added); 
0

Если вы используете DataAdapter ...

foreach (DataRow row in rows) 
{ 
    Row.BeginEdit();   
    //Do your stuff   
    Row.EndEdit(); 
} 
dataAdapter.Update(_dataSet, "yourTable"); 
0

Другим вариантом является использование ItemArray свойства для обновления экземпляра DataRow. Единственное, что вам еще нужно выбрать правильные строки. Также обратите внимание, что вам необходимо изменить весь ItemArray, а не его элементы, чтобы иметь modification reflected in the DataTable.

foreach (DataRow row in rows) 
{ 
    // Select the row 
    var rows = _dataSet.Tables[tableName].Select(string.Format("Table_ID = {0}", row["Table_ID"])); 

    // Update the row 
    if (0 < rows.Length) 
     rows[0].ItemArray = (object[])row.ItemArray.Clone(); 
} 

Независимо от того, как вы выбрали для обновления DataRow, вы можете поместить все это в методе расширения.

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