2011-04-20 3 views
3

У меня есть таблица отношений «многие ко многим» в типизированном DataSet. Для удобства при обновлении я удаляю старые отношения, прежде чем добавлять новые (возможно, такие же, как и раньше).DataTable: удаляет старые DataRows перед тем, как вставить новый сейф?

Теперь я задаюсь вопросом, является ли этот способ безотказным или я должен гарантировать только удаление, которое действительно удалено (например, с LINQ), и добавьте только тот, который действительно является новым.

В SQL-Server есть уникальное ограничение, определенное для таблицы отношений, два внешних ключа являются составным первичным ключом.

Является ли заказ DataAdapter обновлением DataRows, который содержит RowState <> Без изменений предсказуемо или нет? Другими словами: возможно ли, что DataAdapter.Update(DataTable) приведет к исключению, если ключ уже существует?

Это DataModel:

Datamodel

Это часть кода (LbSymptomCodes является ListBox ASP.Net):

Dim daTrelRmaSymptomCode As New ERPModel.dsRMATableAdapters.trelRMA_SymptomCodeTableAdapter 
For Each oldTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow In thisRMA.GettrelRMA_SymptomCodeRows 
    oldTrelRmaSymptomCodeRow.Delete() 
Next 
For Each item As ListItem In LbSymptomCodes.Items 
    If item.Selected Then 
     Dim newTrelRmaSymptomCodeRow As ERPModel.dsRMA.trelRMA_SymptomCodeRow = Services.dsRMA.trelRMA_SymptomCode.NewtrelRMA_SymptomCodeRow 
     newTrelRmaSymptomCodeRow.fiRMA = Services.IdRma 
     newTrelRmaSymptomCodeRow.fiSymptomCode = CInt(item.Value) 
     Services.dsRMA.trelRMA_SymptomCode.AddtrelRMA_SymptomCodeRow(newTrelRmaSymptomCodeRow) 
    End If 
Next 
daTrelRmaSymptomCode.Update(Services.dsRMA.trelRMA_SymptomCode) 

Спасибо заранее.

ответ

1

Я думаю, что DataAdapter в ADO.NET достаточно умен, чтобы выполнить удаление/вставки в правильном порядке.

Однако, если вы действительно хотите убедиться, что обновления выполнены в правильном порядке, вы должны сделать это вручную, используя метод Select для возврата массива строк данных для каждого конкретного состояния строки. Затем можно вызвать метод Update на массив строк данных

DataTable tbl = ds.Tables["YourTable"]; 

// Process any Deleted rows first 
adapter.Update(tbl.Select(null, null, DataViewRowState.Deleted)); 

// Process any Updated/Modified rows 
adapter.Update(tbl.Select(null, null, DataViewRowState.ModifiedCurrent)); 

// Process the Inserts last 
adapter.Update(tbl.Select(null, null, DataViewRowState.Added)); 
+0

Спасибо. Но это приведет к появлению трех DB-вызовов (и трех транзакций) вместо одного. Я не мог RejectChanges, когда обновление завершилось с ошибкой в ​​добавленных строках для уже принятых изменений в удаленных и измененных строках. –

+0

@TimSchmelter: Не могли бы вы обернуть все обновления в одной транзакции в блоке try/catch для отката, если возникнут какие-либо ошибки? – codingbadger

+0

Возможно, но сложно, потому что в типизированном наборе данных эта логика инкапсулируется в автогенерируемые TableAdapters. Я должен был бы расширить эти адаптеры в частичном классе в отдельном файле, чем автогенерированный, и предоставить сам DataAdapter для предоставления транзакции.Но я бы хотел избежать этого лишнего усилия;) –

1

Не уверен, ПДР, но в теории DB операции должны выполняться в следующем порядке удаления, вставки, обновления.

глядя на MSDN точную формулировку метода обновления является

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

В отношении вашего решения удаление элементов и, возможно, повторно вставляя те же элементы, как правило, этого следует избегать, поскольку он создает нагрузку на БД. В приложениях с большим объемом вы хотите сделать все возможное, чтобы минимизировать вызовы в БД, поскольку они очень дороги; время вычисления, от определения того, какие обновления строк являются ложными, дешево.

+0

Спасибо. Поскольку пользователь (а также мало пользователей) может выбрать только 1-5 элементов в ListBox, дополнительная загрузка для БД довольно ограничена. –

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