연습: 관련 데이터 테이블의 데이터 저장(계층적 업데이트)
단일 데이터 테이블로 작업하고 외래 키 제약 조건을 고려할 필요가 없는 경우 응용 프로그램의 데이터를 데이터베이스에 다시 저장하는 것은 비교적 간단합니다. 하지만 둘 이상의 관련 데이터 테이블을 포함하는 데이터 집합의 데이터를 저장해야 하는 경우에는 제약 조건을 위반하지 않도록 데이터베이스에 특정한 순서에 따라 변경 사항을 보내야 합니다. 관련 테이블에서 수정된 데이터를 업데이트할 때 각 데이터 테이블에서 데이터의 특정 하위 집합을 추출하고 올바른 순서로 데이터베이스에 업데이트를 전송하는 프로그래밍 논리를 제공하거나 TableAdapterManager 구성 요소를 사용할 수 있습니다.
이 연습에서는 TableAdapterManager 구성 요소를 사용하여 관련 데이터를 저장하는 방법을 보여 줍니다. 관련 데이터 테이블을 수동으로 업데이트하는 코드를 작성하는 방법에 대한 자세한 내용은 연습: 데이터베이스에 데이터 저장(여러 테이블)을 참조하십시오.
사전 요구 사항
이 연습을 완료하려면 다음이 필요합니다.
- Northwind 샘플 데이터베이스에 대한 액세스. 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
Windows 기반 응용 프로그램 만들기
이 연습의 첫 번째 단계는 새 Windows 기반 응용 프로그램을 만드는 것입니다.
새 Windows 기반 응용 프로그램을 만들려면
파일 메뉴에서 새 프로젝트를 만듭니다.
참고
Visual Basic과 C# 프로젝트에서 계층적 업데이트를 지원하므로 두 언어 중 하나로 새 프로젝트를 만듭니다.
프로젝트 이름을 HierarchicalUpdateWalkthrough로 지정합니다.
Windows Forms 응용 프로그램을 선택하고 확인을 클릭합니다. 자세한 내용은 Windows 기반 응용 프로그램 만들기를 참조하십시오.
HierarchicalUpdateWalkthrough 프로젝트가 만들어져 솔루션 탐색기에 추가됩니다.
데이터 집합 만들기
계층적 업데이트를 보여 줄 수 있는 관련 테이블이 필요하므로 다음 단계에서는 Northwind 데이터베이스의 Customers 및 Orders 테이블이 들어 있는 데이터 집합을 만듭니다. 데이터 소스 구성 마법사를 사용하여 데이터 집합을 만듭니다. 연결을 만들려면 Northwind 샘플 데이터베이스에 액세스할 수 있는 권한이 있어야 합니다. Northwind 샘플 데이터베이스를 설치하는 방법에 대한 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
데이터 집합을 만들려면
데이터 메뉴에서 데이터 소스 표시를 클릭합니다.
데이터 소스 창에서 새 데이터 소스 추가를 클릭하여 데이터 소스 구성 마법사를 시작합니다.
데이터 소스 형식 선택 페이지에서 데이터베이스를 클릭하고 다음을 클릭합니다.
데이터 연결 선택 페이지에서 다음 작업 중 하나를 수행합니다.
Northwind 샘플 데이터베이스에 대한 데이터 연결이 드롭다운 목록 상자에 표시되면 해당 연결을 클릭합니다.
또는
새 연결을 클릭하여 연결 추가/수정 대화 상자를 엽니다. 자세한 내용은 연결 추가/수정 대화 상자(일반)를 참조하십시오.
데이터베이스에 암호가 필요하면 중요한 데이터를 포함하는 옵션을 선택하고 다음을 클릭합니다.
응용 프로그램 구성 파일에 연결 문자열 저장 페이지에서 다음을 클릭합니다.
데이터베이스 개체 선택 페이지에서 테이블 노드를 확장합니다.
Customers 및 Orders 테이블의 확인란을 클릭한 다음 마침을 클릭합니다.
NorthwindDataSet가 만들어지고 프로젝트에 추가된 후 테이블이 데이터 소스 창에 나타납니다.
생성되는 기본 데이터 바인딩된 컨트롤 변경
데이터 소스 창에서 내용을 입력한 후 Windows Form으로 항목을 끌어 올 때 만들어지는 컨트롤을 선택할 수 있습니다. 이 연습을 실행하기 위해 Customers 테이블의 데이터가 개별 컨트롤(자세히)에 표시됩니다. Orders 테이블의 데이터는 DataGridView 컨트롤(DataGridView)에 표시됩니다.
데이터 소스 창에서 항목에 대한 컨트롤을 설정하려면
데이터 소스 창에서 Customers 노드를 확장합니다.
Customers 노드의 컨트롤 목록에서 자세히를 클릭하여 Customers 테이블에 대해 만들어지는 컨트롤을 개별 컨트롤로 변경합니다. 자세한 내용은 방법: 데이터 소스 창에서 끌어 올 때 만들 컨트롤 설정을 참조하십시오.
참고
Orders 테이블에서는 기본 컨트롤인 DataGridView를 사용합니다.
데이터 바인딩된 폼 만들기
데이터 소스 창에서 컨트롤을 선택한 후 폼으로 항목을 끌어 와 데이터 바인딩된 컨트롤을 만듭니다.
Customers 및 Orders 데이터에 대한 데이터 바인딩된 컨트롤을 만들려면
주 Customers 노드를 데이터 소스 창에서 Form1으로 끌어서 놓습니다.
TableAdapterManager 구성 요소, 레코드 탐색에 사용되는 도구 모음(BindingNavigator)과 함께 설명 레이블이 있는 데이터 바인딩된 컨트롤이 폼에 나타납니다. 구성 요소 트레이에 형식화된 DataSet, TableAdapter 및 BindingSource가 나타납니다.
관련 Orders 노드를 데이터 소스 창에서 Form1로 끌어서 놓습니다.
참고
관련 Orders 노드는 Customers 테이블의 Fax 노드 아래에 있으며 Customers 노드의 자식 노드입니다. Customers 노드의 피어로 나타나는 Orders 노드는 테이블의 모든 주문을 나타냅니다. Customers 노드의 자식 노드로 나타나는 Orders 노드는 관련 주문을 나타냅니다.
DataGridView 컨트롤과 레코드 탐색에 사용되는 도구 모음(BindingNavigator)이 폼에 나타나고 TableAdapter 및 BindingSource가 구성 요소 트레이에 표시됩니다.
계층적 업데이트를 수행하기 위해 생성된 저장 코드 수정
TableAdapterManager.UpdateAll 메서드를 호출하고 관련 테이블이 들어 있는 데이터 집합 이름을 전달하여 데이터 집합의 관련 데이터 테이블에서 변경된 사항을 데이터베이스에 저장합니다. 예를 들어 NorthwindDataset의 모든 테이블에 대한 업데이트를 백 엔드 데이터베이스에 전송하려면 TableAdapterManager.UpdateAll(NorthwindDataset) 메서드를 실행합니다.
데이터 소스 창의 항목을 끌어 놓으면 각 테이블을 채우는 Form_Load 이벤트(TableAdapter.Fill 메서드)에 코드가 자동으로 추가됩니다. 데이터 집합의 데이터를 데이터베이스에 다시 저장하는 BindingNavigator의 저장 단추 클릭 이벤트(TableAdapterManager.UpdateAll 메서드)에도 코드가 추가됩니다.
생성된 저장 코드에는 CustomersBindingSource.EndEdit 메서드를 호출하는 코드 줄도 포함됩니다. 좀 더 자세하게 설명하면 이 코드는 폼에 추가된 첫 번째 BindingSource의 EndEdit 메서드를 호출합니다. 다시 말하면 이 코드는 데이터 소스 창에서 폼으로 끌어 온 첫 번째 테이블에 대해서만 생성됩니다. EndEdit 호출은 현재 편집 중인 모든 데이터 바인딩된 컨트롤에서 처리 중인 변경 내용을 모두 커밋합니다. 따라서 데이터 바인딩된 컨트롤에 아직 포커스가 있을 때 저장 단추를 클릭하면 해당 컨트롤의 모든 보류 중인 편집 내용이 실제 저장 전에 커밋됩니다(TableAdapterManager.UpdateAll 메서드).
참고
디자이너는 폼에 끌어다 놓은 첫 번째 테이블에 대해서만 BindingSource.EndEdit 코드를 추가합니다. 따라서 폼의 각 관련 테이블에 대해 BindingSource.EndEdit 메서드를 호출하는 코드 줄을 추가해야 합니다. 따라서 이 연습에서는 OrdersBindingSource.EndEdit 메서드에 대한 호출을 추가해야 합니다.
저장하기 전에 관련 테이블의 변경 사항을 커밋하는 코드를 업데이트하려면
BindingNavigator에서 저장 단추를 두 번 클릭하여 Form1을 코드 편집기에서 엽니다.
CustomersBindingSource.EndEdit 메서드를 호출하는 코드 줄 다음에 OrdersBindingSource.EndEdit 메서드를 호출하는 코드 줄을 추가합니다. 저장 단추 클릭 이벤트에 있는 코드는 다음과 같습니다.
Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Me.TableAdapterManager.UpdateAll(Me.NorthwindDataSet)
this.Validate(); this.customersBindingSource.EndEdit(); this.ordersBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.northwindDataSet);
데이터베이스에 데이터를 저장하기 전에 관련 자식 테이블에 대한 변경 사항을 커밋해야 할 뿐만 아니라 데이터 집합에 새 자식 레코드를 추가하기 전에 새로 생성된 부모 레코드를 커밋해야 합니다. 즉, 외래 키 제약 조건에서 데이터 집합에 추가할 새 자식 레코드(Orders)를 활성화하기 전에 데이터 집합에 새 부모 레코드(Customer)를 추가해야 합니다. 이렇게 하기 위해 자식 BindingSource.AddingNew 이벤트를 사용할 수 있습니다.
참고
새 부모 레코드의 커밋 여부는 데이터 소스에 바인딩하는 데 사용된 컨트롤 형식에 따라 달라집니다. 이 연습에서는 개별 컨트롤을 사용하여 부모 테이블에 바인딩하므로 새 부모 레코드를 커밋하는 코드가 추가로 필요합니다. 부모 레코드가 DataGridView와 같은 복합 바인딩 컨트롤에 표시되는 경우에는 부모 레코드에 대한 이 추가 EndEdit 호출이 필요 없습니다. 이것은 컨트롤의 내부 데이터 바인딩 기능에서 새 레코드의 커밋을 처리하기 때문입니다.
새 자식 레코드를 추가하기 전에 데이터 집합에서 부모 레코드를 커밋하는 코드를 추가하려면
OrdersBindingSource.AddingNew 이벤트에 대한 이벤트 처리기를 만듭니다.
- 디자인 보기에서 Form1을 열고 구성 요소 트레이에서 OrdersBindingSource를 클릭하고 속성 창에서 이벤트를 선택한 후 AddingNew 이벤트를 두 번 클릭합니다.
이벤트 처리기에 CustomersBindingSource.EndEdit 메서드를 호출하는 코드 줄을 추가합니다. OrdersBindingSource_AddingNew 이벤트 처리기의 코드는 다음과 같아야 합니다.
Me.CustomersBindingSource.EndEdit()
this.customersBindingSource.EndEdit();
계층적 업데이트 설정 여부 확인
데이터 집합의 Hierarchical Update 속성을 설정하여 계층적 업데이트를 설정하거나 해제할 수 있습니다. 계층적 업데이트는 기본적으로 설정되므로 이 연습에서는 Hierarchical Update 속성을 변경할 필요가 없습니다.
계층적 업데이트가 설정되었는지 확인하려면
솔루션 탐색기에서 NorthwindDataSet.xsd 파일을 두 번 클릭하여 데이터 집합 디자이너에서 데이터 집합을 엽니다.
디자인 화면에서 빈 영역을 선택합니다.
속성 창에서 Hierarchical Update 속성을 찾아 True로 설정되어 있는지 확인합니다.
참고
Hierarchical Update 속성 설정은 TableAdapterManager와 계층적 업데이트를 수행하는 논리가 있는 코드가 생성되는 여부를 제어합니다. HierarchicalUpdate를 True로 설정하면 TableAdapterManager가 생성되고 HierarchicalUpdate를 False로 설정하면 TableAdapterManager가 생성되지 않습니다.
응용 프로그램 테스트
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
각 테이블에서 하나 이상의 레코드에 대해 데이터를 변경합니다.
새 고객을 추가한 다음 해당 고객에 대한 새 주문을 추가합니다.
Save 단추를 클릭합니다. TableAdapterManager가 모든 관련 업데이트에 필요한 논리를 처리합니다.
데이터베이스에서 값을 확인하여 각 테이블에 변경 내용이 저장되었는지 확인합니다.
다음 단계
응용 프로그램 요구 사항에 따라 Windows 기반 응용 프로그램에서 관련 데이터를 저장한 후 몇 단계를 더 수행해야 할 수도 있습니다. 이 응용 프로그램에서 보완할 수 있는 사항은 다음과 같습니다.
OrderDetails 테이블과 같은 세 번째 테이블을 추가하고 세 개의 테이블 계층 구조를 시험해 봅니다.
데이터가 데이터베이스 제약 조건과 응용 프로그램의 요구 사항을 모두 충족하는지 확인하는 유효성 검사 코드를 추가합니다. 자세한 내용은 데이터 유효성 검사를 참조하십시오.
참고 항목
작업
방법: 데이터 바인딩된 컨트롤에서 데이터를 저장하기 전에 In-Process 편집 커밋
방법: 기존 Visual Studio 프로젝트에서 계층적 업데이트 구현
연습: 관련 데이터 테이블의 데이터 저장(계층적 업데이트)