다음을 통해 공유


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

 

게시 날짜: 2016년 4월

이 연습에서는 System.Transactions 네임스페이스를 사용하여 트랜잭션에서 데이터를 저장하는 방법을 보여줍니다. 이 예에서는 Northwind 샘플 데이터베이스의 CustomersOrders 테이블을 사용합니다.

사전 요구 사항

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

Windows 응용 프로그램 만들기

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

새 Windows 프로젝트를 만들려면

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

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

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

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

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

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

데이터 소스를 만들려면

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

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

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

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

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

      또는

    • 새 연결을 선택하여 연결 추가/수정 대화 상자를 시작하고 Northwind 데이터베이스에 대한 연결을 만듭니다.

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

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

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

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

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

폼에 컨트롤 추가

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

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

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

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

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

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

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

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

BindingNavigator의 SaveItem 단추에 대한 코드 수정

기본적으로 폼에 놓는 첫 번째 테이블에 대해 BindingNavigator에 있는 저장 단추의 click 이벤트에 코드가 추가됩니다. 추가 테이블을 업데이트하려면 코드를 수동으로 추가해야 합니다. 이 연습에서는 저장 단추의 클릭 이벤트 처리기에서 기존 저장 코드를 리팩터링한 다음 몇 가지 메서드를 추가로 만들어 행의 추가 또는 삭제 필요성에 따른 특정 업데이트 기능을 제공합니다.

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

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

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

            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();
                }
            }
    
        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
    

관련 데이터의 변경을 조정하는 순서는 다음과 같습니다.

  • 자식 레코드를 삭제합니다. 여기서는 Orders 테이블에서 레코드를 삭제합니다.

  • 부모 레코드를 삭제합니다. 여기서는 Customers 테이블에서 레코드를 삭제합니다.

  • 부모 레코드를 삽입합니다. 여기서는 Customers 테이블에 레코드를 삽입합니다.

  • 자식 레코드를 삽입합니다. 여기서는 Orders 테이블에 레코드를 삽입합니다.

기존 주문을 삭제하려면

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

            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");
                    }
                }
            }
    
        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
    

기존 고객을 삭제하려면

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

            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");
                    }
                }
            }
    
        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
    

새 고객을 추가하려면

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

            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");
                    }
                }
            }
    
        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
    

새 주문을 추가하려면

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

            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");
                    }
                }
            }
    
        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
    

응용 프로그램 실행

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

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

참고 항목

트랜잭션 및 동시성
Oracle 분산 트랜잭션
방법: 트랜잭션을 사용하여 데이터 저장
SQL Server와의 System.Transactions 통합
Visual Studio에서 데이터에 연결
데이터를 받기 위해 응용 프로그램 준비
데이터를 응용 프로그램으로 페치
Visual Studio에서 데이터에 컨트롤 바인딩
응용 프로그램에서 데이터 편집
데이터 유효성 검사
데이터 저장