0

ADO.Net의 형식화 된 데이터 집합은 DataRelation이 두 테이블 (예 : 부모와 자식) 사이에 설정된 경우 삭제 및 업데이트를 계단식으로 수행 할 수 있어야합니다. 그러나 나는 이것을 작동시킬 수 없었다. 나는 분명히해야한다 : 그것은 나를 위해 메모리 내에서 작용한다; 그러나 그것은 데이터베이스에 지속되지 않습니다.계단식 삭제가 내 입력 된 데이터 집합의 데이터베이스에 유지되지 않음

내 데이터베이스에 색상 및 상자라는 두 개의 테이블이있는 테스트 프로젝트를 설정했습니다. 각 ID에는 기본 기본 키와 이름 (예 : 'BoxId, BoxName')이 있습니다. Colors는 부모 및 Boxes이며 ForeignKey 제약 조건으로 표시된 ColorId 필드도 있습니다. 그런 다음 각 테이블마다 하나씩 두 개의 DataGridView가있는 Winform을 설정합니다. 두 테이블을 새로운 Dataset으로 드래그하고 디자이너와의 관계가 나타났습니다. 관계를 "Foreign Key and Relation"관계로 편집하고 3 개의 참조 무결성 옵션을 모두 "계단식"(DeleteRule, UpdateRule, AcceptRejectChanges)으로 설정했습니다. 또한 디자이너가 어떤 이유로 든 거부했기 때문에 Boxes 테이블에 대한 DeleteCommand를 만들었습니다. 마지막으로 저장을 위해 각 그리드 옆에 버튼을 배치하고 각 이벤트 핸들러에 Update() 호출을 두십시오 (예 : this.boxesTableAdapter.Update(this.pOCDataSet.Boxes);)

양식과 SQL 프로파일 러를 실행하면 모든 데이터가 표시됩니다. 나는 자식 (상자) 항목을 삭제할 수 있습니다. 이러한 삭제는 데이터베이스에도 DELETE를 생성합니다. Excelente.

상위 그리드 (색상)에서 삭제를 수행하면 삭제 된 행이 사라지고 상자 격자의 행도 사라집니다 (데이터베이스의 FK 제약 조건을 NOCHECK로 가정). 이것은 멋지다. 그러나 프로파일 러에서 명확하게 색상 DELETE 문만 실행되었습니다. Boxes 행이 고아입니다. 응용 프로그램을 다시 시작하지 않는 한 Winform에 표시되지 않습니다.이 시점에서 상자에 삭제 된 행은 FK 제약 조건을 위반하고 있음을 나타내는 왼쪽에 빨간색 느낌표 아이콘이 나타납니다.

내 유일한 옵션은 여기에 참조 용 무결성 항목을 직접 코딩하는 것입니다. 자신이 저장 한 proc을 사용하여 색상 삭제를 수행하는 것입니다 (내부에서는 상자 삭제도 수행합니다). SQL Server에서 DELETE CASCADE를 주문하거나 색상 삭제 명령문에서 인라인 상자를 삭제할 수도 있습니다. 내 모델의 DataRelation 개체가이 문제를 처리한다고 가정합니다. 분명히 BindingSource 객체는 자식 그리드에서 관련 행을 제거하기 때문에 가져옵니다. 그런데 왜 모델이 Boxes 테이블과 Colors 테이블에 대해 먼저 삭제를 수행하지 않는 것입니까?

답변

0

데이터 집합의 행을 삭제하면 데이터 집합에서 삭제 표시 만됩니다. 데이터를 삭제하려는 DB의 모든 테이블에 대해 테이블 ​​어댑터를 사용해야합니다. 데이터 집합을 메모리에있는 데이터베이스 버전으로 생각할 수 있습니다. 이러한 변경 사항은 FK 오류를 방지하기 위해 올바른 순서로 데이터베이스에 커밋해야합니다. 귀하의 경우에 당신은 ...과 같이 약속 된 자녀 (상자)에 대한 모든 삭제 후에이 도움이

this.boxesTableAdapter.Update(this.pOCDataSet.Boxes); 
this.colorsTableAdapter.Update(this.pOCDataSet.Colors); 

희망을 부모 테이블 (색)에 대한 업데이트 문을 실행해야합니다.

관련 문제