2011-04-20 3 views
3

나는 형식화 된 데이터 집합에 다 대다 관계 테이블을 가지고 있습니다. 업데이트를 편리하게하기 위해 이전에 관계를 삭제하기 전에 새로운 (이전과 같음)을 추가합니다.DataTable : 새 안전을 삽입하기 전에 이전 DataRow를 삭제하고 있습니까?

이 방법은 안전 장치의 경우 지금은 궁금해하거나 내가 확인해야하는 경우에만 정말 (LINQ와 함께 예를 들어)을 삭제하는 삭제 만 정말 새로운 하나를 추가 할 수 있습니다. SQL-서버에서

가 관계 테이블에 정의 된 고유 제한 조건이며, 두 개의 외래 키는 복합 기본 키입니다.

는 데이터 어댑터가의 RowState가 <> 변경되지 않은 예측하거나하지 않은 데이터 행을 업데이트 순서인가? 즉, DataAdapter.Update(DataTable)은 키가 이미 존재할 때 예외가 될 수 있습니까?

Datamodel

이 코드의 일부입니다 (LbSymptomCodes는 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

나는 ADO.NET에서 데이터 어댑터가 올바른 순서로 삭제/삽입을 수행 할 수있을만큼 영리하다고 생각합니다.

그러나 실제로 올바른 순서로 업데이트가 수행되도록하려면 Select 메서드를 사용하여 수동으로 업데이트해야 각 특정 행 상태에 대한 데이터 행 배열을 반환해야합니다. 그런 다음 DB 트랜잭션이 다음과 같은 순서로 삭제, 삽입, 업데이트 수행해야

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 호출 3 건 (그리고 트랜잭션 3 건)이 발생합니다. 나는 삭제 된 행과 변경된 행에 대해 이미 수락 된 변경 사항에 대해 Added-Rows에서 업데이트가 실패 할 때 RejectChanges를 수행 할 수 없었습니다. –

+0

@TimSchmelter : 오류가 발생하면 롤백 할 try/catch 블록 내의 모든 트랜잭션을 단일 트랜잭션으로 래핑 할 수 없습니까? – codingbadger

+0

입력 된 데이터 집합에서이 논리가 자동 생성 된 TableAdapters에 캡슐화되어 있기 때문에 가능하지만 어렵습니다. 자동 생성 된 파일과는 별도의 파일로 부분 클래스에서이 어댑터를 확장하고 DataAdapter 자체를 노출시켜 트랜잭션을 제공해야합니다.하지만 나는이 여분의 노력을 피하고 싶다.) –

1

검찰 확실하지만 이론하지 데이터 행의 배열에 Update 메서드를 호출 할 수 있습니다. MSDN에서 업데이트 방법에 대한 정확한 표현을 찾고

는 데이터베이스에 DataTable의 모든 변경 사항을 저장

인용문 시도이다. (이 테이블에 삽입 된 행을 추가, 테이블에서 삭제 된 행을 제거하고, 변경된 테이블에서 모든 행을 업데이트하는 작업이 포함됩니다.) 인용문

삭제 항목 가능성이 다시의 솔루션에 관해서 동일한 항목을 삽입하는 것이 일반적으로 말하면 DB에로드를 생성하기 때문에 피해야합니다. 대용량 애플리케이션에서는 매우 비싸지 만 DB에 대한 호출을 최소화 할 수있는 모든 작업을 수행하고자합니다. 어떤 행 갱신이 가짜인지를 결정하는 것에서 계산 시간은 싸다.

+0

고마워. 사용자 (및 사용자가 많지 않음)는 ListBox에서 1-5 개 항목 만 선택할 수 있기 때문에 DB에 대한 추가로드가 다소 제한적입니다. –

관련 문제