2011-11-25 2 views
1

저는 지난 몇 년 동안 ORM을 사용 해왔고, 개인 프로젝트에서 간단한 ADO.NET으로 어려움을 겪고 있습니다.ADO.NET 부분 업데이트/삽입 수행

나는 트랜잭션과 천천히 변화하는 데이터를 저장하는 테이블을 가진 데이터베이스를 가지고있다. 업데이트/삽입 할 데이터는 네트워크를 통해 제공됩니다.

많은/모든 ADO.NET 데이터베이스 구현을 허용하기 위해 비교적 일반적인 DB 클래스의 ADO.NET에서 연결이 끊긴 데이터 어댑터 패러다임을 사용하려고합니다.

데이터베이스 테이블의 잠재적 인 크기 때문에 메모리에 Adapter.Fill을 수행하고 싶지 않습니다. (모든 참조 및 튜토리얼에서 알 수 있듯이) 델타 데이터 세트를 사용합니다. 새/수정 된 데이터를 다시 데이터베이스에 저장합니다.

DataSet에서 DbDataAdapter.FillSchema를 수행하면 키 데이터를 전달하는 것과 관계없이 모든 데이터가 업데이트 될 때 새 데이터로 처리됩니다. Adapter.Update를 사용하는 테이블.

올바른 일괄 처리 UPDATE/INSERT를 수행하기 위해 올바른 ADO.NET 클래스를 사용하고 있습니까 (어떤 배치가 실제로 루프에서 수행되지 않아도된다는 관점에서 "배치"에 의해). 뚜껑)?

답변

0

여기의 문제는 데이터 행의 RowState로 판명되었습니다.

DataAdapter를 통해 DataSet을 채우면 기존 행과 기존 행을 변경하면 행의 RowState가 수정 됨으로 설정됩니다.

DataSet에 추가 된 데이터는 새 행으로 표시되고 RowState는 Added로 설정됩니다.

RowState는 읽기 전용 필드이므로 수동으로 수정 됨으로 설정할 수 없습니다.

// ... where dataTransferObject.IsNew == false 
DataRow row = table.NewRow(); 

row["Id"] = dataTransferObject.Id;//Set Key fields on row 

table.Rows.Add(row);//Add row to table    

row.AcceptChanges();//change RowState to Unchanged 

row["MyData1"] = dataTransferObject.MyData1; //Set other fields in row 
row["MyData2"] = dataTransferObject.MyData2; //Set other fields in row 
row["MyData3"] = dataTransferObject.MyData3; //Set other fields in row 

가 나는 또한 내 삽입, 업데이트 및 선택 문 공예 CommandBuilder의 손을 무시하고 다음과 같이

따라서, 클라이언트로부터 수신 한 모든 업데이트 데이터를 추가해야합니다.

이 데이터

지금 adapter.Update

난이 우아한 솔루션에서 멀리이다 aknowledge

를 사용하여 데이터베이스에 지속하지만, 하나를 작업 할 수 있습니다. 더 좋은 방법을 찾으면이 답변을 업데이트하겠습니다.

관련 문제