다음을 통해 공유


방법: 데이터베이스에 데이터 집합 변경 내용 저장

데이터 집합의 데이터를 수정하고 유효성을 검사한 후에는 업데이트된 데이터를 다시 데이터베이스에 보낼 수 있습니다. 수정한 데이터를 데이터베이스에 보내려면 TableAdapter 또는 데이터 어댑터의 Update 메서드를 호출합니다. 어댑터의 Update 메서드는 단일 데이터 테이블을 업데이트하고 테이블의 각 데이터 행에 대한 RowState에 따라 올바른 명령(INSERT, UPDATE 또는 DELETE)을 실행합니다.

데이터를 관련 테이블에 저장할 경우 Visual Studio에서는 데이터베이스에 정의된 외래 키 제약 조건에 따라 올바른 순서로 저장을 수행하도록 돕는 TableAdapterManagers 구성 요소를 제공합니다. 자세한 내용은 계층적 업데이트 개요를 참조하십시오.

참고

데이터 집합의 내용으로 데이터 소스를 업데이트하는 동안 오류가 발생할 수 있으므로 어댑터의 Update 메서드를 호출하는 코드는 try/catch 블록 안에 넣어야 합니다.

데이터 소스를 업데이트하는 정확한 절차는 비즈니스 요구 사항에 따라 다르지만 사용자 응용 프로그램에는 다음과 같은 단계가 포함되어야 합니다.

  1. try/catch 블록 안에 있는 데이터베이스에 업데이트를 보내는 코드를 실행합니다.

  2. 예외가 발생하면 오류를 일으킨 데이터 행을 찾습니다. 자세한 내용은 방법: 오류가 있는 행 찾기를 참조하십시오.

  3. 잘못된 행을 가능하면 프로그래밍 방식으로 수정하고 그렇지 않으면 사용자에게 표시하여 직접 수정하게 하여 데이터 행의 문제를 조정한 다음 업데이트(HasErrors 속성, GetErrors 메서드)를 다시 시도합니다.

데이터를 데이터베이스에 저장

데이터베이스에 쓸 값이 포함된 데이터 테이블의 이름을 전달하면서 TableAdapter 또는 데이터 어댑터의 Update 메서드를 호출합니다. 단일 데이터 테이블의 데이터를 다시 데이터베이스에 저장하는 방법에 대한 자세한 내용은 연습: 데이터베이스에 데이터 저장(단일 테이블)을 참조하십시오.

TableAdapter를 사용하여 데이터 집합으로 데이터베이스를 업데이트하려면

  • try/catch 블록 안에 TableAdapter.Update 메서드를 넣습니다. 다음 예제에서는 NorthwindDataSet의 Customers 테이블 내용으로 업데이트하는 방법을 보여 줍니다.

    Try
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
        MsgBox("Update successful")
    
    Catch ex As Exception
        MsgBox("Update failed")
    End Try
    
    try
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.customersTableAdapter.Update(this.northwindDataSet.Customers);
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    

데이터 어댑터를 사용하여 데이터 집합으로 데이터베이스를 업데이트하려면

  • try/catch 블록 안에 DataAdapter.Update 메서드를 넣습니다. 다음 예제에서는 DataSet1에서 Table1의 내용으로 데이터 소스를 업데이트하는 방법을 보여 줍니다.

    Try
        SqlDataAdapter1.Update(Dataset1.Tables("Table1"))
    
    Catch x As Exception
        ' Error during Update, add code to locate error, reconcile 
        ' and try to update again.
    End Try
    
    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile 
        // and try to update again.
    }
    

데이터 집합에서 두 개의 관련 테이블 업데이트

데이터 집합에서 관련 테이블을 업데이트할 때 참조 무결성 제약 조건을 위반하는 위험성을 줄이기 위해 올바른 순서로 업데이트하는 것이 중요합니다. 명령 실행의 순서도 데이터 집합의 DataRowCollection 인덱스를 따릅니다. 데이터 무결성 오류가 발생하는 것을 막기 위한 가장 좋은 방법은 다음과 같은 순서로 데이터베이스를 업데이트하는 것입니다.

  1. 자식 테이블: 레코드 삭제

  2. 부모 테이블: 레코드 삽입, 업데이트 및 삭제

  3. 자식 테이블: 레코드 삽입 및 업데이트

여러 테이블의 데이터를 저장하는 방법에 대한 자세한 내용은 연습: 데이터베이스에 데이터 저장(여러 테이블)을 참조하십시오.

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

TableAdapter를 사용하여 두 관련 테이블을 업데이트하려면

  1. 세 개의 임시 DataTable을 만들어 서로 다른 레코드를 보관합니다.

  2. try/catch 블록 안에서 행의 각 하위 집합에 대해 Update 메서드를 호출합니다. 업데이트 오류가 발생하면 제안된 작업 흐름이 분기되어 문제를 해결합니다.

  3. 변경 내용을 데이터 집합에서 데이터베이스로 커밋합니다.

  4. 임시 데이터 테이블을 삭제하여 리소스를 해제합니다.

    Private Sub UpdateDB()
        Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
        Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
        Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
        Try
            If deletedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(deletedChildRecords)
            End If
    
            CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
            If newChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(newChildRecords)
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(modifiedChildRecords)
            End If
    
            NorthwindDataSet.AcceptChanges()
    
        Catch ex As Exception
            MessageBox.Show("An error occurred during the update process")
            ' Add code to handle error here.
    
        Finally
            If deletedChildRecords IsNot Nothing Then
                deletedChildRecords.Dispose()
            End If
    
            If newChildRecords IsNot Nothing Then
                newChildRecords.Dispose()
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                modifiedChildRecords.Dispose()
            End If
    
        End Try
    End Sub
    
    void UpdateDB()
    {
        NorthwindDataSet.OrdersDataTable deletedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        NorthwindDataSet.OrdersDataTable newChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
        try
        {
            if (deletedChildRecords != null)
            {
                ordersTableAdapter.Update(deletedChildRecords);
            }
    
            customersTableAdapter.Update(northwindDataSet.Customers);
    
            if (newChildRecords != null)
            {
                ordersTableAdapter.Update(newChildRecords);
            }
    
            if (modifiedChildRecords != null)
            {
                ordersTableAdapter.Update(modifiedChildRecords);
            }
    
            northwindDataSet.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred during the update process");
            // Add code to handle error here.
        }
    
        finally
        {
            if (deletedChildRecords != null)
            {
                deletedChildRecords.Dispose();
            }
            if (newChildRecords != null)
            {
                newChildRecords.Dispose();
            }
            if (modifiedChildRecords != null)
            {
                modifiedChildRecords.Dispose();
            }
        }
    }
    

데이터 어댑터를 사용하여 두 관련 테이블을 업데이트하려면

  • 각 데이터 어댑터의 Update 메서드를 호출합니다.

    다음 예제에서는 관련 테이블이 들어 있는 데이터 집합으로 데이터 소스를 업데이트하는 방법을 보여 줍니다. 위의 순서를 따르려면 서로 다른 레코드가 들어 있는 세 개의 임시 DataTable을 만들어야 합니다. 그런 다음 try/catch 블록 안에서 행의 각 하위 집합에 대해 Update 메서드를 호출합니다. 업데이트 오류가 발생하면 제안된 작업 흐름이 분기되어 문제를 해결합니다. 그런 다음 데이터 집합에서 변경내용을 커밋합니다. 마지막으로, 임시 데이터 테이블을 삭제하여 리소스를 해제합니다.

    Private Sub UpdateDB()
        Dim DeletedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Deleted)
    
        Dim NewChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Added)
    
        Dim ModifiedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Modified)
    
        Try
            If Not DeletedChildRecords Is Nothing Then
                daOrders.Update(DeletedChildRecords)
            End If
    
            daCustomers.Update(dsNorthwind1, "Customers")
    
            If Not NewChildRecords Is Nothing Then
                daOrders.Update(NewChildRecords)
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                daOrders.Update(ModifiedChildRecords)
            End If
    
            dsNorthwind1.AcceptChanges()
    
        Catch ex As Exception
            ' Update error, resolve and try again
    
        Finally
            If Not DeletedChildRecords Is Nothing Then
                DeletedChildRecords.Dispose()
            End If
    
            If Not NewChildRecords Is Nothing Then
                NewChildRecords.Dispose()
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                ModifiedChildRecords.Dispose()
            End If
        End Try
    End Sub
    
    void UpdateDB()
    {
        System.Data.DataTable DeletedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted);
    
        System.Data.DataTable NewChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added);
    
        System.Data.DataTable ModifiedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified);
    
        try
        {
            if (DeletedChildRecords != null)
            {
                daOrders.Update(DeletedChildRecords);
            }
            if (NewChildRecords != null)
            {
                daOrders.Update(NewChildRecords);
            }
            if (ModifiedChildRecords != null)
            {
                daOrders.Update(ModifiedChildRecords);
            }
    
            dsNorthwind1.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            // Update error, resolve and try again
        }
    
        finally
        {
            if (DeletedChildRecords != null)
            {
                DeletedChildRecords.Dispose();
            }
            if (NewChildRecords != null)
            {
                NewChildRecords.Dispose();
            }
            if (ModifiedChildRecords != null)
            {
                ModifiedChildRecords.Dispose();
            }
        }
    }
    

참고 항목

개념

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

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

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

기타 리소스

데이터 연습

Visual Studio에서 데이터에 연결

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

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

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

데이터 유효성 검사

데이터 저장