Share via


연습: 트랜잭션에 데이터 저장

이 연습에서는 System.Transactions 네임스페이스를 사용하여 트랜잭션에 데이터를 저장하는 방법에 대해 설명합니다. 이 예제에서는 Northwind 샘플 데이터베이스의 Customers와 Orders 테이블을 사용합니다.

사전 요구 사항

이 연습을 수행하려면 Northwind 샘플 데이터베이스에 액세스해야 합니다. Northwind 샘플 데이터베이스 설치에 대한 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.

Windows 응용 프로그램 만들기

첫 단계에서는 Windows 응용 프로그램을 만듭니다.

새 Windows 프로젝트를 만들려면

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

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

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

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

데이터베이스 데이터 소스 만들기

이 단계에서는 Northwind 샘플 데이터베이스의 Customers와 Orders 테이블을 기반으로 데이터 소스 구성 마법사를 사용하여 데이터 소스를 만듭니다.

데이터 소스를 만들려면

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

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

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

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

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

      또는

    • 새 연결을 선택하여 연결 추가/수정 대화 상자를 시작하고 Northwind 데이터베이스에 대한 연결을 만듭니다. 자세한 내용은 연결 추가/수정 대화 상자(일반)를 참조하십시오.

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

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

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

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

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

폼에 컨트롤 추가

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

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

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

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

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

  • 관련 Orders 노드(주 Orders 노드가 아닌 Fax 열 아래의 관련 자식 테이블 노드)를 CustomersDataGridView 아래의 폼으로 끌어서 놓습니다.

    폼에 DataGridView가 나타납니다. OrdersTableAdapterBindingSource가 구성 요소 트레이에 표시됩니다.

System.Transactions 어셈블리에 참조 추가

트랜잭션에서는 System.Transactions 네임스페이스를 사용합니다. system.transactions 어셈블리에 대한 프로젝트 참조는 기본적으로 추가되지 않으므로 수동으로 추가해야 합니다.

System.Transactions DLL 파일에 참조를 추가하려면

  1. 프로젝트 메뉴에서 참조 추가를 선택합니다.

  2. System.Transactions(.NET 탭에서)를 선택하고 확인을 클릭합니다.

    System.Transactions에 대한 참조가 프로젝트에 추가됩니다.

BindingNavigator의 SaveItem 단추에서 코드 수정

기본적으로 폼에 끌어 놓은 첫째 테이블의 경우 코드는 BindingNavigator에 있는 저장 단추의 click 이벤트에 추가됩니다. 추가 테이블을 업데이트하려면 코드를 수동으로 추가해야 합니다. 이 연습에서는 저장 단추의 클릭 이벤트 처리기에서 기존 저장 코드를 리팩터링하고 몇 개의 메서드를 더 만들어 행을 추가해야 하는지 또는 삭제해야 하는지 여부를 기준으로 특정 업데이트 기능을 제공합니다.

자동 생성 저장 코드를 수정하려면

  1. CustomersBindingNavigator에서 저장 단추(플로피 디스크 아이콘이 있는 단추)를 두 번 클릭합니다.

  2. CustomersBindingNavigatorSaveItem_Click 메서드를 다음 코드로 바꿉니다.

    Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click
        UpdateData()
    End Sub
    
    Private Sub UpdateData()
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.OrdersBindingSource.EndEdit()
    
        Using updateTransaction As New Transactions.TransactionScope
    
            DeleteOrders()
            DeleteCustomers()
            AddNewCustomers()
            AddNewOrders()
    
            updateTransaction.Complete()
            NorthwindDataSet.AcceptChanges()
        End Using
    End Sub
    
    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

관련 데이터에 대한 변경 내용을 조정하는 순서는 다음과 같습니다.

  • 자식 레코드 삭제(이 경우 Orders 테이블에서 레코드 삭제)

  • 부모 레코드 삭제(이 경우 Customers 테이블에서 레코드 삭제)

  • 부모 레코드 삽입(이 경우 Customers 테이블에 레코드 삽입)

  • 자식 레코드 삽입(이 경우 Orders 테이블에 레코드 삽입)

기존 주문을 삭제하려면

  • 다음 DeleteOrders 메서드를 Form1에 추가합니다.

    Private Sub DeleteOrders()
    
        Dim deletedOrders As NorthwindDataSet.OrdersDataTable
        deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(deletedOrders) Then
            Try
                OrdersTableAdapter.Update(deletedOrders)
    
            Catch ex As Exception
                MessageBox.Show("DeleteOrders Failed")
            End Try
        End If
    End Sub
    
    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

기존 고객을 삭제하려면

  • 다음 DeleteCustomers 메서드를 Form1에 추가합니다.

    Private Sub DeleteCustomers()
    
        Dim deletedCustomers As NorthwindDataSet.CustomersDataTable
        deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(deletedCustomers) Then
            Try
                CustomersTableAdapter.Update(deletedCustomers)
    
            Catch ex As Exception
                MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

새 고객을 추가하려면

  • 다음 AddNewCustomers 메서드를 Form1에 추가합니다.

    Private Sub AddNewCustomers()
    
        Dim newCustomers As NorthwindDataSet.CustomersDataTable
        newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(newCustomers) Then
            Try
                CustomersTableAdapter.Update(newCustomers)
    
            Catch ex As Exception
                MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

새 주문을 추가하려면

  • 다음 AddNewOrders 메서드를 Form1에 추가합니다.

    Private Sub AddNewOrders()
    
        Dim newOrders As NorthwindDataSet.OrdersDataTable
        newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(newOrders) Then
            Try
                OrdersTableAdapter.Update(newOrders)
    
            Catch ex As Exception
                MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

응용 프로그램 실행

응용 프로그램을 실행하려면

  • F5 키를 눌러 응용 프로그램을 실행합니다.

참고 항목

작업

방법: 트랜잭션을 사용하여 데이터 저장

개념

Oracle 분산 트랜잭션

SQL Server와 System.Transactions의 통합(ADO.NET)

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

기타 리소스

트랜잭션 및 동시성(ADO.NET)

Visual Studio에서 데이터에 연결

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

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

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

데이터 유효성 검사

데이터 저장