다음을 통해 공유


안내서: .NET Framework 애플리케이션에서 트랜잭션 내에 데이터를 저장하기

비고

클래스 및 관련 클래스는 DataSet 2000년대 초반의 레거시 .NET Framework 기술로, 애플리케이션이 데이터베이스와 연결이 끊긴 동안 애플리케이션이 메모리의 데이터로 작업할 수 있도록 합니다. 이 기술은 사용자가 데이터를 수정하고 변경 내용을 데이터베이스에 다시 유지할 수 있도록 하는 앱에 특히 유용합니다. 데이터 세트는 입증된 성공적인 기술이지만 새 .NET 애플리케이션에 권장되는 방법은 Entity Framework Core를 사용하는 것입니다. Entity Framework는 테이블 형식 데이터를 개체 모델로 사용하는 보다 자연스러운 방법을 제공하며 더 간단한 프로그래밍 인터페이스를 제공합니다.

이 가이드에서는 System.Transactions 네임스페이스를 사용하여 트랜잭션으로 데이터를 저장하는 방법을 설명합니다. 이 연습에서는 Windows Forms 애플리케이션을 만듭니다. 데이터 원본 구성 마법사를 사용하여 Northwind 샘플 데이터베이스에서 두 테이블에 대한 데이터 세트를 만듭니다. Windows 양식에 데이터 바인딩된 컨트롤을 추가하고 BindingNavigator의 저장 단추에 대한 코드를 수정하여 TransactionScope 내에서 데이터베이스를 업데이트합니다.

필수 조건

이 자습서를 완료하려면 Visual Studio에 설치된 .NET 데스크톱 개발및 데이터 스토리지 및 처리 워크로드가 필요합니다. 설치하려면 Visual Studio 설치 관리자 열고 수정하려는 Visual Studio 버전 옆에 있는 수정(또는 추가>수정)을 선택합니다. 을(를) 참조하여 Visual Studio을(를) 수정하세요.

이 연습에서는 SQL Server Express LocalDB 및 Northwind 샘플 데이터베이스를 사용합니다.

  1. SQL Server Express LocalDB가 없는 경우 SQL Server Express 다운로드 페이지 또는 Visual Studio 설치 관리자를 통해 설치합니다. Visual Studio 설치 관리자에서 SQL Server Express LocalDB는 .NET 데스크톱 개발 워크로드의 일부로 설치하거나 개별 구성 요소로 설치할 수 있습니다.

  2. 다음 단계에 따라 Northwind 샘플 데이터베이스를 설치합니다.

    1. Visual Studio에서 SQL Server 개체 탐색기 창을 엽니다. (SQL Server 개체 탐색기는 Visual Studio 설치 관리자에서 데이터 스토리지 및 처리 워크로드의 일부로 설치됩니다.) SQL Server 노드를 확장합니다. LocalDB 인스턴스를 마우스 오른쪽 단추로 클릭하고 새 쿼리 선택합니다.

      쿼리 편집기 창이 열립니다.

    2. Northwind Transact-SQL 스크립트를 클립보드에 복사합니다. 이 T-SQL 스크립트는 Northwind 데이터베이스를 처음부터 만들고 데이터로 채웁니다.

    3. T-SQL 스크립트를 쿼리 편집기에 붙여넣은 다음 실행 단추를 선택합니다.

      잠시 후 쿼리 실행이 완료되고 Northwind 데이터베이스가 만들어집니다.

Windows Forms 애플리케이션 만들기

첫 번째 단계는 Windows Forms 앱(.NET Framework)을 만드는 것입니다.

  1. Visual Studio의 파일 메뉴에서 >프로젝트를 선택합니다.

  2. 왼쪽 창에서 Visual C# 또는 Visual Basic 을 확장한 다음 , Windows Desktop을 선택합니다.

  3. 가운데 창에서 Windows Forms 앱 프로젝트 유형을 선택합니다.

  4. 프로젝트 이름을 SavingDataInATransactionWalkthrough로 지정한 다음 확인을 선택합니다.

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

데이터베이스 데이터 원본 만들기

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

  1. 데이터 원본 창을 열려면 데이터 메뉴에서 데이터 원본 표시를 선택합니다.

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

  3. 데이터 원본 유형 선택 화면에서 데이터베이스를 선택한 다음, 다음을 선택합니다.

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

    • Northwind 샘플 데이터베이스에 대한 데이터 연결을 드롭다운 목록에서 사용할 수 있는 경우 선택합니다.

      -또는-

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

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

  6. 애플리케이션 구성 파일 화면에 연결 문자열 저장 화면에서 다음을 선택합니다.

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

  8. Customers 테이블과 Orders 테이블을 선택한 다음, 마침을 선택합니다.

    NorthwindDataSet이 프로젝트에 추가되고 Customers 테이블과 Orders 테이블이 데이터 원본 창에 표시됩니다.

양식에 컨트롤 추가

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

  1. 데이터 원본 창에서 고객 노드를 확장합니다.

  2. 데이터 원본 창에서 Form1로 기본 고객 노드를 끕니다.

    DataGridView 레코드 탐색을 위한 컨트롤 및 도구 모음(BindingNavigator)이 폼에 나타납니다. NorthwindDataSet , CustomersTableAdapterBindingSourceBindingNavigator 구성 요소 트레이에 나타납니다.

  3. 관련 주문 노드(기본 주문 노드가 아니라 팩스 열 아래의 관련 자식 테이블 노드)를 CustomersDataGridView 아래의 양식으로 끌어옵니다.

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

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

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

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

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

  2. 탭에서 System.Transactions.NET 선택한 다음 확인을 선택합니다.

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

BindingNavigator의 SaveItem 단추에서 코드 수정

폼에 놓인 첫 번째 테이블의 경우 코드는 기본적으로 click 에 있는 저장 단추 BindingNavigator의 이벤트에 추가됩니다. 코드를 수동으로 추가하여 추가 테이블을 업데이트해야 합니다. 이 연습에서는 저장 단추의 클릭 이벤트 처리기에서 기존 저장 코드를 리팩터링합니다. 또한 행을 추가하거나 삭제해야 하는지 여부에 따라 특정 업데이트 기능을 제공하는 몇 가지 메서드를 추가로 만듭니다.

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

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

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

  • 자식 레코드를 삭제합니다. (이 경우 테이블에서 레코드를 삭제합니다 Orders .)

  • 부모 레코드를 삭제합니다. (이 경우 테이블에서 레코드를 삭제합니다 Customers .)

  • 부모 레코드를 삽입합니다. (이 경우 테이블에 레코드를 삽입합니다 Customers .)

  • 자식 레코드를 삽입합니다. (이 경우 테이블에 레코드를 삽입합니다 Orders .)

기존 주문을 삭제하려면

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

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

기존 고객을 삭제하려면

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

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

새 고객을 추가하려면

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

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

새 주문을 추가하려면

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

    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 눌러 애플리케이션을 실행합니다.