Share via


연습: 데이터베이스에 데이터 저장(여러 테이블)

업데이트: 2011년 5월

가장 일반적인 응용 프로그램 개발 시나리오 중 하나는 Windows 응용 프로그램의 폼에 데이터를 표시하고 데이터를 편집한 다음 업데이트된 데이터를 다시 데이터베이스에 보내는 것입니다. 이 연습에서는 관련된 두 테이블의 데이터를 표시하는 폼을 만든 다음 레코드를 편집하고 변경 내용을 데이터베이스에 저장하는 방법을 보여 줍니다. 이 예제에서는 Northwind 샘플 데이터베이스의 Customers와 Orders 테이블을 사용합니다.

TableAdapter의 Update 메서드를 호출하여 응용 프로그램의 데이터를 다시 데이터베이스에 저장할 수 있습니다. 데이터 소스 창에서 항목을 끌어 오면 데이터 저장 코드는 폼으로 끌어 온 첫 번째 테이블에 자동으로 추가됩니다. 폼에 추가된 테이블을 사용하려면 데이터를 저장하는 데 필요한 코드를 수동으로 추가해야 합니다. 이 연습에서는 둘 이상의 테이블에서 업데이트 저장 코드를 추가하는 방법을 보여 줍니다.

참고

표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다. 자세한 내용은 설정에 대한 작업을 참조하십시오.

이 연습에서 수행할 작업은 다음과 같습니다.

  • Windows 응용 프로그램 프로젝트를 만듭니다.

  • 데이터 소스 구성 마법사를 사용하여 응용 프로그램에서 데이터 소스를 만들고 구성합니다.

  • 데이터 소스 창에서 항목의 컨트롤을 설정합니다. 자세한 내용은 방법: 데이터 소스 창에서 끌어 올 때 만들 컨트롤 설정을 참조하십시오.

  • 데이터 소스 창에서 폼으로 항목을 끌어 와 데이터 바인딩된 컨트롤을 만듭니다.

  • 데이터 집합의 각 테이블에서 몇 가지 레코드를 수정합니다.

  • 데이터 집합에서 업데이트된 데이터를 다시 데이터베이스에 보내도록 코드를 수정합니다.

사전 요구 사항

이 연습을 완료하려면 다음과 같은 요건이 필요합니다.

Windows 응용 프로그램 만들기

첫 단계에서는 Windows 응용 프로그램을 만듭니다. 이 단계에서 프로젝트에 이름을 지정하는 것은 선택 사항이지만 나중에 프로젝트를 저장할 예정이므로 이름을 지정합니다.

새 Windows 응용 프로그램 프로젝트를 만들려면

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

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

  3. Windows 응용 프로그램을 선택하고 확인을 클릭합니다. 자세한 내용은 Windows 기반 응용 프로그램 만들기를 참조하십시오.

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

데이터 소스 만들기

이 단계에서는 데이터 소스 구성 마법사를 사용하여 Northwind 데이터베이스에서 데이터 소스를 만듭니다. 연결을 만들려면 Northwind 샘플 데이터베이스에 액세스할 수 있는 권한이 있어야 합니다. Northwind 샘플 데이터베이스 설치에 대한 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.

데이터 소스를 만들려면

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

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

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

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

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

      또는

    • 새 연결을 선택하여 연결 추가/수정 대화 상자를 엽니다. 자세한 내용은 연결 추가/수정 대화 상자(일반)를 참조하십시오.

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

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

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

  8. CustomersOrders 테이블을 선택한 다음 마침을 클릭합니다.

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

만들 컨트롤 설정

이 연습에서는 개별 컨트롤에 데이터가 표시되는 자세히 레이아웃에 Customers 테이블의 데이터가 있고 DataGridView 컨트롤에 표시된 모눈 레이아웃에 Orders 테이블의 데이터가 있습니다.

데이터 소스 창에서 항목에 대한 놓기 형식을 설정하려면

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

  2. Customers 노드의 컨트롤 목록에서 자세히를 선택하여 Customers 테이블의 컨트롤을 개별 컨트롤로 변경합니다. 자세한 내용은 방법: 데이터 소스 창에서 끌어 올 때 만들 컨트롤 설정을 참조하십시오.

데이터 바인딩된 폼 만들기

데이터 소스 창에서 폼으로 항목을 끌어 와 데이터 바인딩된 컨트롤을 만들 수 있습니다.

폼에 데이터 바인딩된 컨트롤을 만들려면

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

    레코드 탐색에 사용되는 도구 스트립(BindingNavigator)과 설명 레이블이 있는 데이터 바인딩된 컨트롤이 폼에 나타납니다. NorthwindDataSet, CustomersTableAdapter, BindingSourceBindingNavigator가 구성 요소 트레이에 나타납니다.

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

    참고

    관련 Orders 노드는 Fax 열 아래에 있으며 Customers 노드의 자식 노드입니다.

    DataGridView 컨트롤과 레코드 탐색에 사용되는 도구 스트립(BindingNavigator)이 폼에 나타납니다. OrdersTableAdapterBindingSource가 구성 요소 트레이에 표시됩니다.

데이터베이스를 업데이트하는 코드 추가

CustomersOrders TableAdapters의 Update 메서드를 호출하여 데이터베이스를 업데이트할 수 있습니다. 기본적으로 BindingNavigator저장 단추에 대한 이벤트 처리기가 데이터베이스에 업데이트를 보내는 폼의 코드에 추가됩니다. 이 과정에서는 참조 무결성 오류가 발생하지 않게 적절한 순서로 업데이트를 보내도록 코드를 수정합니다. 또한 코드에서 try-catch 블록에 업데이트 호출을 래핑하여 오류 처리를 구현합니다. 응용 프로그램의 요구 사항을 충족하도록 코드를 수정할 수 있습니다.

참고

알기 쉽도록 하기 위해 이 연습에서는 트랜잭션을 사용하지 않지만 둘 이상의 관련 테이블을 업데이트할 경우 한 트랜잭션 안에 모든 업데이트 논리를 포함시켜야 합니다. 트랜잭션은 변경 내용을 커밋하기 전에 데이터베이스에 대한 모든 관련 변경 내용이 성공하도록 만드는 프로세스입니다. 자세한 내용은 트랜잭션 및 동시성(ADO.NET)을 참조하십시오.

응용 프로그램에 업데이트 논리를 추가하려면

  1. BindingNavigator에서 저장 단추를 두 번 클릭하여 bindingNavigatorSaveItem_Click 이벤트 처리기에 대한 코드 편집기를 엽니다.

  2. 관련 TableAdapter의 Update 메서드를 호출하도록 이벤트 처리기의 코드를 바꿉니다. 다음 코드에서는 먼저 각 DataRowState(Deleted, AddedModified)의 업데이트된 정보를 저장할 임시 데이터 테이블을 세 개 만듭니다. 그런 다음 업데이트를 적절한 순서로 실행합니다. 코드는 다음과 같습니다.

    Me.Validate()
    Me.OrdersBindingSource.EndEdit()
    Me.CustomersBindingSource.EndEdit()
    
    Dim deletedOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
    Dim newOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
    Dim modifiedOrders As NorthwindDataSet.OrdersDataTable = CType(
        NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
    
    Try
        ' Remove all deleted orders from the Orders table.
        If Not deletedOrders Is Nothing Then
            OrdersTableAdapter.Update(deletedOrders)
        End If
    
        ' Update the Customers table.
        CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
        ' Add new orders to the Orders table.
        If Not newOrders Is Nothing Then
            OrdersTableAdapter.Update(newOrders)
        End If
    
        ' Update all modified Orders.
        If Not modifiedOrders Is Nothing Then
            OrdersTableAdapter.Update(modifiedOrders)
        End If
    
        NorthwindDataSet.AcceptChanges()
    
    Catch ex As Exception
        MsgBox("Update failed")
    
    Finally
        If Not deletedOrders Is Nothing Then
            deletedOrders.Dispose()
        End If
    
        If Not newOrders Is Nothing Then
            newOrders.Dispose()
        End If
    
        If Not modifiedOrders Is Nothing Then
            modifiedOrders.Dispose()
        End If
    End Try
    
    this.Validate();
    this.ordersBindingSource.EndEdit();
    this.customersBindingSource.EndEdit();
    
    NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
    NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
    NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable)
        northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
    try
    {
        // Remove all deleted orders from the Orders table.
        if (deletedOrders != null)
        {
            ordersTableAdapter.Update(deletedOrders);
        }
    
        // Update the Customers table.
        customersTableAdapter.Update(northwindDataSet.Customers);
    
        // Add new orders to the Orders table.
        if (newOrders != null)
        {
            ordersTableAdapter.Update(newOrders);
        }
    
        // Update all modified Orders.
        if (modifiedOrders != null)
        {
            ordersTableAdapter.Update(modifiedOrders);
        }
    
        northwindDataSet.AcceptChanges();
    }
    
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    
    finally
    {
        if (deletedOrders != null)
        {
            deletedOrders.Dispose();
        }
        if (newOrders != null)
        {
            newOrders.Dispose();
        }
        if (modifiedOrders != null)
        {
            modifiedOrders.Dispose();
        }
    }
    

응용 프로그램 테스트

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

  1. F5 키를 누릅니다.

  2. 각 테이블에서 하나 이상의 레코드에 대해 데이터를 변경합니다.

  3. 저장 단추를 누릅니다.

  4. 데이터베이스에서 값을 확인하여 변경 내용이 저장되었는지 확인합니다.

    참고

    Customers를 변경하거나 새 Customer 및 Orders 데이터를 추가할 때 Orders 목록을 업데이트하는 방법을 보여 주는 예제 코드를 보려면 방법: 데이터베이스에 새 레코드 삽입연습: 관련 데이터 테이블의 데이터 저장(계층적 업데이트)을 참조하십시오.

다음 단계

응용 프로그램 요구 사항에 따라 Windows 응용 프로그램의 데이터 바인딩된 폼을 만든 후 몇 단계를 더 수행해야 할 수도 있습니다. 이 연습에서 보완할 수 있는 사항은 다음과 같습니다.

참고 항목

개념

데이터 응용 프로그램 개발의 새로운 기능

Visual Studio에서 데이터에 Windows Forms 컨트롤 바인딩

Visual Studio에서 데이터에 컨트롤 바인딩

기타 리소스

데이터 연습

Visual Studio의 데이터 응용 프로그램 개요

Visual Studio에서 데이터에 연결

데이터를 받기 위해 응용 프로그램 준비

데이터를 응용 프로그램으로 페치

응용 프로그램에서 데이터 편집

데이터 유효성 검사

데이터 저장

변경 기록

날짜

변경 내용

이유

2011년 5월

추가 샘플 코드에 대한 링크를 추가했습니다.

고객 의견