다음을 통해 공유


연습: 관련 데이터 테이블의 데이터 저장(계층적 업데이트)

단일 데이터 테이블을 사용 중이며 외래 키 제약 조건을 고려하지 않아도 되는 경우에는 응용 프로그램 프로그램의 데이터를 간단하게 데이터베이스에 다시 저장할 수 있습니다. 그러나 둘 이상의 관련 데이터 테이블을 포함하는 데이터 집합에서 데이터를 저장해야 하는 경우에는 제약 조건을 위반하지 않도록 특정 순서에 따라 변경 내용을 데이터베이스로 보내야 합니다. 관련 테이블에서 수정된 데이터를 업데이트할 때는 각 데이터 테이블에서 특정 데이터 하위 집합을 추출한 다음 올바른 순서에 따라 업데이트를 데이터베이스로 보내는 프로그래밍 논리를 제공할 수도 있고, TableAdapterManager 구성 요소를 사용할 수도 있습니다.

이 연습에서는 TableAdapterManager 구성 요소를 사용하여 관련 데이터를 저장하는 방법을 보여줍니다. 관련 데이터 테이블 업데이트를 수동으로 코딩하는 방법에 대한 자세한 내용은 연습: 데이터베이스에 데이터 저장(여러 테이블)을 참조하세요.

사전 요구 사항

이 연습을 완료하려면 다음 사항이 필요합니다.

Windows 기반 응용 프로그램 만들기

이 연습의 첫 단계에서는 새 Windows 기반 응용 프로그램을 만듭니다.

새 Windows 기반 응용 프로그램을 만들려면

  1. 파일 메뉴에서 새 프로젝트를 만듭니다.

    참고

    Visual Basic 및 C# 프로젝트에서는 계층적 업데이트가 지원되므로 이러한 언어 중 하나로 새 프로젝트를 만듭니다.

  2. 프로젝트 이름을 HierarchicalUpdateWalkthrough로 지정합니다.

  3. Windows Forms 응용 프로그램을 선택하고 확인을 클릭합니다. 자세한 내용은 .NET Framework로 클라이언트 응용 프로그램 개발을 참조하십시오.

    HierarchicalUpdateWalkthrough 프로젝트가 만들어져 솔루션 탐색기에 추가됩니다.

데이터 집합 만들기

계층적 업데이트를 시연하려면 관련 테이블이 필요하므로 다음 단계에서는 Northwind 데이터베이스의 Customers 및 Orders 테이블이 포함된 데이터 집합을 만듭니다. 데이터 소스 구성 마법사를 사용하여 데이터 집합을 만듭니다. 연결을 만들려면 Northwind 샘플 데이터베이스에 액세스해야 합니다. Northwind 샘플 데이터베이스를 설정하는 방법에 대한 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하세요.

데이터 집합을 만들려면

  1. 데이터 메뉴에서 데이터 소스 표시를 클릭합니다.

  2. 데이터 소스 창에서 새 데이터 소스 추가를 클릭하여 데이터 소스 구성 마법사를 시작합니다.

  3. 데이터 소스 형식 선택 페이지에서 데이터베이스를 클릭하고 다음을 클릭합니다.

  4. 데이터 연결 선택 페이지에서 다음 작업 중 하나를 수행합니다.

    • Northwind 샘플 데이터베이스에 대한 데이터 연결이 드롭다운 목록 상자에 표시되면 해당 연결을 클릭합니다.

      또는

    • 새 연결을 클릭하여 연결 추가/수정 대화 상자를 엽니다.

  5. 데이터베이스에 암호가 필요하면 중요한 데이터를 포함하는 옵션을 선택하고 다음을 클릭합니다.

  6. 응용 프로그램 구성 파일에 연결 문자열 저장 페이지에서 다음을 클릭합니다.

  7. 데이터베이스 개체 선택 페이지에서 테이블 노드를 확장합니다.

  8. CustomersOrders 테이블의 확인란을 클릭한 다음 마침을 클릭합니다.

    NorthwindDataSet가 만들어져 프로젝트에 추가되고 테이블이 데이터 소스 창에 나타납니다.

생성할 기본 데이터 바인딩된 컨트롤 변경

데이터 소스 창이 채워지고 나면 항목을 Windows Form으로 끌어 올 때 생성되도록 할 컨트롤을 선택할 수 있습니다. 이 연습에서는 Customers 테이블의 데이터를 개별 컨트롤(Details)에 표시합니다. Orders 테이블의 데이터는 DataGridView 컨트롤(DataGridView)에 표시됩니다.

데이터 소스 창에서 항목에 대한 컨트롤을 설정하려면

  1. 데이터 소스 창에서 Customers 노드를 확장합니다.

  2. Customers 노드에서 Details를 클릭하여 Customers 테이블에 대해 생성할 컨트롤을 개별 컨트롤로 변경합니다. 자세한 내용은 방법: 데이터 소스 창에서 끌어 올 때 만들 컨트롤 설정을 참조하십시오.

    참고

    Orders 테이블에는 기본 컨트롤인 DataGridView가 사용됩니다.

데이터 바인딩된 폼 만들기

데이터 소스 창에서 컨트롤을 선택한 후에는 폼으로 해당 컨트롤을 끌어 데이터 바인딩된 컨트롤을 만듭니다.

Customers 및 Orders 데이터에 대해 데이터 바인딩된 컨트롤을 만들려면

  1. Customers 노드를 데이터 소스 창에서 Form1로 끌어 옵니다.

    설명 레이블이 있는 데이터 바인딩된 컨트롤이 레코드 탐색을 위한 도구 모음인 TableAdapterManager 구성 요소(BindingNavigator)와 함께 폼에 나타납니다. 형식이 지정된 DataSet, TableAdapterBindingSource가 구성 요소 트레이에 표시됩니다.

  2. 관련 Orders 노드를 데이터 소스 창에서 Form1로 끌어 옵니다.

    참고

    Customers 테이블의 Fax 노드 아래에 있는 관련 Orders 노드는 Customers 노드의 자식 노드입니다.Customers 노드의 피어로 표시되는 Orders 노드는 테이블의 모든 주문을 나타냅니다.Customers 노드의 자식 노드로 표시되는 Orders 노드는 관련 주문을 나타냅니다.

    DataGridView 컨트롤과 레코드 탐색을 위한 도구 모음(BindingNavigator)이 폼에 나타납니다. TableAdapterBindingSource가 구성 요소 트레이에 표시됩니다.

계층적 업데이트를 수행하도록 생성된 저장 코드 수정

TableAdapterManager.UpdateAll 메서드를 호출한 다음 관련 테이블이 포함된 데이터 집합의 이름을 전달하여 데이터 집합의 관련 데이터 테이블에서 데이터베이스로 변경 내용을 저장합니다. 예를 들어 NorthwindDataset에 포함된 모든 테이블의 업데이트를 백 엔드 데이터베이스로 보내려면 TableAdapterManager.UpdateAll(NorthwindDataset) 메서드를 실행합니다.

데이터 소스 창에서 항목을 놓으면 코드가 Form_Load 이벤트에 자동으로 추가되어 각 테이블을 채웁니다(TableAdapter.Fill 메서드). 또한 데이터 집합의 데이터를 데이터베이스에 다시 저장할 수 있도록 BindingNavigator저장 단추 클릭 이벤트에도 코드가 추가됩니다(TableAdapterManager.UpdateAll 메서드).

생성된 저장 코드에는 CustomersBindingSource.EndEdit 메서드를 호출하는 코드 줄도 포함됩니다. 구체적으로 이 코드는 폼에 추가된 첫 번째 BindingSourceEndEdit 메서드를 호출합니다. 다시 말해서 이 코드는 데이터 소스 창에서 폼으로 끈 첫 번째 테이블에 대해서만 생성됩니다. EndEdit 호출에서는 현재 편집 중인 데이터 바인딩된 컨트롤의 프로세스에 포함된 모든 변경 내용을 커밋합니다. 따라서 데이터 바인딩된 컨트롤에 계속 포커스가 있는 상태에서 저장 단추를 클릭하면 실제 저장 전에 해당 컨트롤에서 보류 중인 모든 편집 내용이 커밋됩니다(TableAdapterManager.UpdateAll 메서드).

참고

디자이너는 폼에 놓은 첫 번째 테이블에 대해서만 BindingSource.EndEdit 코드를 추가합니다.그러므로 폼의 각 관련 테이블에 대해 BindingSource.EndEdit 메서드를 호출하는 코드 줄을 추가해야 합니다.이 연습에서는 OrdersBindingSource.EndEdit 메서드 호출을 추가해야 합니다.

저장 전에 관련 테이블로 변경 내용을 커밋하도록 코드를 업데이트하려면

  1. BindingNavigator에서 저장 단추를 두 번 클릭하여 코드 편집기에서 Form1을 엽니다.

  2. 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 호출을 추가로 수행할 필요가 없습니다.컨트롤의 기본 데이터 바인딩 기능이 새 레코드 커밋을 처리하기 때문입니다.

새 자식 레코드를 추가하기 전에 데이터 집합에서 부모 레코드를 커밋하는 코드를 추가하려면

  1. OrdersBindingSource.AddingNew 이벤트에 대한 이벤트 처리기를 만듭니다.

    • 디자인 뷰에서 Form1을 열고 구성 요소 트레이에서 OrdersBindingSource를 클릭한 다음 속성 창에서 이벤트를 선택하고 AddingNew 이벤트를 두 번 클릭합니다.
  2. CustomersBindingSource.EndEdit 메서드를 호출하는 코드 줄을 이벤트 처리기에 추가합니다. OrdersBindingSource_AddingNew 이벤트 처리기의 코드는 다음과 같습니다.

    Me.CustomersBindingSource.EndEdit()
    
    this.customersBindingSource.EndEdit();
    

계층적 업데이트를 사용하도록 설정했는지 확인

데이터 집합의 계층적 업데이트 속성을 설정하여 계층적 업데이트를 설정 및 해제합니다. 계층적 업데이트는 기본적으로 사용하도록 설정되어 있으므로 이 연습에서는 계층적 업데이트 속성 값을 변경하지 않아도 됩니다.

계층적 업데이트가 사용하도록 설정되었는지 확인하려면

  1. 솔루션 탐색기에서 NorthwindDataSet.xsd 파일을 두 번 클릭하여 데이터 집합 디자이너에서 데이터 집합을 엽니다.

  2. 디자인 화면의 빈 영역을 선택합니다.

  3. 속성 창에서 계층적 업데이트 속성을 찾아 True로 설정되어 있는지 확인합니다.

    참고

    계층적 업데이트 속성 설정은 TableAdapterManager와 함께 코드가 생성되는지 여부 및 계층적 업데이트 수행 여부를 결정하는 논리를 제어합니다.HierarchicalUpdateTrue로 설정하면 TableAdapterManager가 생성되고 HierarchicalUpdateFalse로 설정하면 TableAdapterManager가 생성되지 않습니다.

응용 프로그램 테스트

응용 프로그램을 테스트하려면

  1. F5 키를 누릅니다.

  2. 각 테이블에 포함된 레코드 하나 이상의 데이터를 변경해 봅니다.

  3. 새 고객을 추가하고 해당 고객의 새 주문을 추가합니다.

  4. 저장 단추를 클릭합니다. TableAdapterManager에서 모든 관련 업데이트에 필요한 논리를 처리합니다.

  5. 데이터베이스의 값을 점검하여 변경 내용이 각 테이블에 저장되었는지 확인합니다.

다음 단계

응용 프로그램 요구 사항에 따라 Windows 기반 응용 프로그램에서 관련 데이터를 저장한 후 몇 단계를 더 수행해야 할 수도 있습니다. 이 응용 프로그램에서 개선할 수 있는 몇 가지 사항은 다음과 같습니다.

  • OrderDetails 테이블과 같은 세 번째 테이블을 추가하고 3개 테이블 계층 구조로 위의 작업을 수행해 봅니다.

  • 유효성 검사 코드를 추가하여 데이터가 데이터베이스 제약 조건 및 응용 프로그램 요구 사항을 충족하는지 확인합니다. 자세한 내용은 데이터 유효성 검사을 참조하십시오.

참고 항목

작업

방법: 데이터 집합의 외래 키 제약 조건 구성

방법: 계층적 업데이트를 수행하는 경우 순서 설정

방법: 데이터 바인딩된 컨트롤에서 데이터를 저장하기 전에 In-Process 편집 커밋

방법: 기존 Visual Studio 프로젝트에서 계층적 업데이트 구현

연습: 관련 데이터 테이블의 데이터 저장(계층적 업데이트)

개념

데이터 저장

기타 리소스

계층적 업데이트

DataSets, DataTables 및 DataViews