(1) 프롤로그
DataSet에 기본/하위 테이블(기본 키 테이블/외래 키 테이블)이 모두 포함되어 있는 경우 관계 제약 조건이 너무 엄격한 경우가 있습니다.
예를 들어 관계형 데이터베이스 무결성 규칙은 다음과 같습니다.
1. 기본 키 테이블의 기본 키는 비어 있을 수 없습니다.
2. 참조 무결성 외래 키 테이블의 외래 키 값은 기본 키 테이블의 기본 키와 일치해야 합니다.
비어 있거나 기본 키 테이블의 기본 키 값입니다.
3. 무결성을 사용자 정의하십시오.
DataSet 테이블에 정의된 다중 테이블 관계 제약 조건이 너무 엄격한 경우 Update 메서드를 직접 사용하세요.
DataSet에 여러 테이블을 함께 제출할 경우 무결성 규칙이 충족되지 않아 오류가 발생할 수 있습니다.
이유: 예를 들어 CompanyMain(회사 기본 테이블)과 CompanySon(회사 하위 테이블)이라는 두 개의 테이블을 설정합니다.
CompanyMain(회사 메인 테이블)은 주로 회사의 기본 정보를 저장하고, CompanySon(회사 서브 테이블)은 주로 회사의 기본 정보를 저장합니다.
주로 이 회사의 일부 고객에 대한 정보를 저장하고 있으며, 회사의 메인 테이블에는 (ID), 하위 테이블에는 (BelongID)가 저장되어 있습니다.
연결, 즉 기본 및 외래 키 관계를 설정합니다. 즉, 하나의 회사가 여러 고객에 해당합니다. 즉, ID:BelongID = 1:n 관계입니다.
메인 테이블의 ID는 자동으로 생성된 숫자입니다.
그래서:
새로운 회사 인터페이스를 함께 제출하면 시스템은 데이터베이스 업데이트를 위한 "데이터베이스 무결성 규칙"을 준수하지 않습니다.
하위 테이블을 먼저 업데이트한 후 메인 테이블을 업데이트할 경우, 메인 테이블에 회사 정보가 아직 삽입되지 않았기 때문에 오류가 보고될 수 있습니다.
데이터베이스의 테이블에는 회사 번호: ID가 생성되지 않으며 하위 테이블이 업데이트될 때 해당 BelongID가 없습니다.
이때, "외래키 테이블의 외래키는 null이 아니다"라는 무결성 규칙이 설정되어 있으면 예외가 발생한다.
이는 단지 오류의 가능성일 뿐이며 오류가 발생할 가능성이 더 높으며 이러한 오류는 분산 설계에서 발생할 가능성이 더 높습니다.
2
) 솔루션은
일반적으로 다음과 같은 규칙을 따르므로 많은 오류 가능성을 피할 수 있습니다.
규칙. DataSet을 업데이트하기 전에 <table> 및 <RowState 속성 테이블>을 기준으로 분할 제출을 수행합니다.
I. <table>을 기준으로 분할 제출을 수행한다는 의미는
DataSet의 테이블이 함께 제출되지 않고 한 번에 하나씩 제출된다는 의미입니다. 테이블, 여러 번 제출
II. <테이블의 RowState 속성>에 따른 분할 제출은
RowState 속성에 따라 DataSet의 단일 테이블을 분할하고
동일한 RowState를 한 번 제출하고 여러 번 제출하는
것을 의미합니다. 2.
규칙 기반
.1, 먼저 <new> 및 <modified> 상태를 업데이트한 다음 <deleted>를 업데이트합니다.
즉, 먼저 DataRowState 값을 업데이트합니다: Added 및 Modified, 그런 다음 업데이트: 삭제됨.
규칙 1 및 규칙에 따라
.
2, DataRowState가 Added 및 Modified이면 기본 테이블이 먼저 업데이트되고 Rule
1 및 Rule 2에 따라 DataRowState가 삭제되면 하위 테이블이 먼저 업데이트되고 그 다음 하위 테이블이 업데이트
됩니다.하위 테이블이 업데이트됩니다.
(3) 위의 세 가지 규칙을 다음과 같이 요약합니다.
1. DataSet에서 테이블을 분할하고 RowState에 따라 각 테이블 레코드를 그룹화하고 다른 데이터 세트에 저장합니다
. 업데이트는 DataSet의 매개변수를 허용하고 WebService는 //DataSet만 지원합니다
.직렬화 작업에 대한
코드 예
:업데이트할 데이터 세트는 다음과 같다고 가정합니다. dsCompany(기본 테이블 두 개 포함) 및 하위 테이블) 테이블,
업데이트할 데이터 저장)
//dtCompanyMain은 회사 메인 테이블 정보를 저장하고, dtCompanySon은 회사 하위 테이블 정보를 저장합니다.
DataTable dtCompanyMail = ds.Tables["dtCompanyMain"].Clone() //메인 테이블 데이터를 분리하여
다른 객체를 저장합니다
. DataTable dtCompanySon = ds.Talbes[ "dtCompanySon"].Clone(); //하위 테이블 데이터를 분리하고
다른 객체를 저장합니다
. DataSet dsAdded = new DataSet() //메인 테이블에 새로 추가된 데이터를 저장합니다.
DataSet dsMidified = new DataSet(); 메인 테이블 테이블 편집 행 레코드 저장
DataSet dsDeleted = new DataSet(); //메인 테이블 삭제된 행 레코드 저장
dsAdded = dtCompanyMain.GetChanges(DataRowState.Added) //
메인 테이블에설정된 새 행 레코드
가져오기dsMidified = dtCompanyMain.GetChanges (DataRowState.Modified); //메인 테이블에서
편집된
행 레코드 세트 가져오기 dsDeleted = dtCompanyMain.GetChanges(DataRowState.Deleted); //메인 테이블에서 삭제된
행 레코드 세트
가져오기2. DataRowState 상태 업데이트 추가 및 수정된 레코드
SqlDataAdapter.Update(dsAdded,"dtCompanyMain") //데이터베이스에 추가된 레코드 세트 업데이트
SqlDataAdapter.Update(dsModified,"dtCompanyMain") //수정된 레코드 세트 업데이트
데이터베이스
에3. 하위 테이블 DataRowState 상태 업데이트: 레코드 추가 및 수정됨
... //코드 생략, 2개의 기본 테이블 업데이트와
유사
4. 하위 테이블 DataRowState 상태 업데이트: 레코드 삭제됨.
.... // 아래 5와 유사한 코드 생략
5. 기본 테이블 DataRowState 상태를 다음으로 업데이트합니다. 삭제된 레코드
SqlDataAdapter.Update(dsDeleted, "dtCompanyMain") // 수정된 레코드 세트를 데이터베이스로 업데이트합니다.
읽어주셔서 감사합니다!