.NET Framework를 사용하여 데이터 세트의 데이터 편집

참고 항목

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

모든 데이터베이스의 테이블에서 데이터를 편집하는 것과 마찬가지로 데이터 테이블의 데이터를 편집합니다. 이 프로세스에는 테이블에서 레코드 삽입, 업데이트 및 삭제가 포함될 수 있습니다. 데이터 바인딩된 폼에서는 사용자가 편집할 수 있는 필드를 지정할 수 있습니다. 이러한 경우 데이터 바인딩 인프라는 변경 내용을 나중에 데이터베이스로 다시 보낼 수 있도록 모든 변경 내용 추적을 처리합니다. 프로그래밍 방식으로 데이터를 편집하고 해당 변경 내용을 데이터베이스로 다시 보내려는 경우 변경 내용 추적을 수행하는 개체 및 메서드를 사용해야 합니다.

실제 데이터를 변경하는 외에 DataTable을 쿼리하여 특정 데이터 행을 반환할 수도 있습니다. 예를 들어 개별 행, 특정 버전의 행(원래 행 및 제안된 행), 변경된 행 또는 오류가 있는 행을 쿼리할 수 있습니다.

데이터 세트의 행을 편집하려면

DataTable에서 기존 행을 편집하려면 편집할 DataRow를 찾은 다음 업데이트된 값을 원하는 열에 할당해야 합니다.

편집하려는 행의 인덱스를 모르는 경우 FindBy 메서드를 사용하여 기본 키로 검색합니다.

NorthwindDataSet.CustomersRow customersRow = 
    northwindDataSet1.Customers.FindByCustomerID("ALFKI");

customersRow.CompanyName = "Updated Company Name";
customersRow.City = "Seattle";

행 인덱스를 알고 있는 경우 다음과 같이 행에 액세스하고 편집할 수 있습니다.

northwindDataSet1.Customers[4].CompanyName = "Updated Company Name";
northwindDataSet1.Customers[4].City = "Seattle";

데이터 세트에 새 행을 삽입하려면

데이터 바인딩된 컨트롤을 사용하는 애플리케이션은 일반적으로 BindingNavigator 컨트롤새로 추가 단추를 통해 새 레코드를 추가합니다.

데이터 세트에 새 레코드를 수동으로 추가하려면 DataTable에서 메서드를 호출하여 새 데이터 행을 만듭니다. 그런 다음 DataTableDataRow 컬렉션(Rows)에 행을 추가합니다.

NorthwindDataSet.CustomersRow newCustomersRow = 
    northwindDataSet1.Customers.NewCustomersRow();

newCustomersRow.CustomerID = "ALFKI";
newCustomersRow.CompanyName = "Alfreds Futterkiste";

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

데이터 세트가 데이터 원본에 업데이트를 보내는 데 필요한 정보를 유지하려면 Delete 메서드를 사용하여 데이터 테이블에서 행을 제거합니다. 예를 들어 애플리케이션에서 TableAdapter(또는 DataAdapter)를 사용하는 경우 TableAdapter의 Update 메서드는 데이터베이스에서 RowStateDeleted인 행을 삭제합니다.

애플리케이션이 데이터 원본에 업데이트를 다시 보낼 필요가 없는 경우 데이터 행 컬렉션(Remove)에 직접 액세스하여 레코드를 제거할 수 있습니다.

데이터 테이블에서 레코드를 삭제하려면

  • DataRowDelete 메서드를 호출합니다.

    이 메서드는 레코드를 물리적으로 제거하지 않습니다. 대신 삭제할 레코드를 표시합니다.

    참고 항목

    DataRowCollection의 count 속성을 가져오는 경우 결과 개수에는 삭제를 위해 표시된 레코드가 포함됩니다. 삭제하도록 표시되지 않은 레코드의 정확한 수를 가져오려면 각 레코드의 RowState 속성을 보고 컬렉션을 반복할 수 있습니다. (삭제하도록 표시된 레코드는 RowStateDeleted입니다.) 또는, 행 상태에 따라 필터링하는 데이터 세트의 데이터 뷰를 만들고 해당 위치에서 count 속성을 가져올 수 있습니다.

다음 예제에서는 Delete 메서드를 호출하여 Customers 테이블의 첫 번째 행을 삭제됨으로 표시하는 방법을 보여 줍니다.

northwindDataSet1.Customers.Rows[0].Delete();

변경된 행이 있는지 확인

데이터 세트의 레코드를 변경하면 커밋할 때까지 해당 변경 내용에 대한 정보가 저장됩니다. 데이터 세트 또는 데이터 테이블의 AcceptChanges 메서드를 호출하거나 TableAdapter 또는 데이터 어댑터의 Update 메서드를 호출하면 변경 내용이 커밋됩니다.

변경 내용은 각 데이터 행에서 다음 두 가지 방법으로 추적됩니다.

  • 각 데이터 행에는 RowState 관련 정보가 포함됩니다(예: Added, Modified, Deleted 또는 Unchanged).

  • 변경된 각 데이터 행에는 해당 행의 여러 버전(DataRowVersion), 즉 원래 버전(변경 전) 및 현재 버전(변경 후)이 포함됩니다. 변경이 보류되는 기간(RowChanging 이벤트에 응답할 수 있는 시간)에는 세 번째 버전인 제안된 버전도 사용할 수 있습니다.

데이터 세트의 HasChanges 메서드는 데이터 세트가 변경된 경우 true를 반환합니다. 변경된 행이 있는지 확인한 후에는 DataSet 또는 DataTableGetChanges메서드를 호출하여 변경된 행 집합을 반환할 수 있습니다.

변경된 행이 있는지 확인하려면

  • 데이터 세트의 HasChanges 메서드를 호출하여 변경된 행을 확인합니다.

다음 예제에서는 HasChanges 메서드의 반환 값을 확인하여 NorthwindDataset1이라는 데이터 세트에 변경된 행이 있는지 여부를 검색하는 방법을 보여 있습니다.

if (northwindDataSet1.HasChanges()) 
{
    // Changed rows were detected, add appropriate code.
}
else
{
    // No changed rows were detected, add appropriate code.
}

변경 유형 확인

DataRowState 열거형의 값을 HasChanges 메서드에 전달하여 데이터 세트에서 수행된 변경의 유형을 확인할 수도 있습니다.

행에 대한 변경 유형을 확인하려면

다음 예제에서는 NorthwindDataset1이라는 데이터 세트를 확인하여 새 행이 추가되었는지 확인하는 방법을 보여 줍니다.

if (northwindDataSet1.HasChanges(DataRowState.Added)) 
{
    // New rows have been added to the dataset, add appropriate code.
}
else
{
    // No new rows have been added to the dataset, add appropriate code.
}

오류가 있는 행을 찾으려면

개별 데이터 열 및 행에서 작업할 때 오류가 발생할 수 있습니다. HasErrors 속성을 보고 DataSet, DataTable 또는 DataRow에 오류가 있는지 확인할 수 있습니다.

  1. HasErrors 속성을 확인하여 데이터 세트에 오류가 있는지 봅니다.

  2. HasErrors 속성이 true이면 테이블의 컬렉션을 반복한 다음 행을 반복하여 오류가 있는 행을 찾습니다.

private void FindErrors() 
{
    if (dataSet1.HasErrors)
    {
        foreach (DataTable table in dataSet1.Tables)
        {
            if (table.HasErrors)
            {
                foreach (DataRow row in table.Rows)
                {
                    if (row.HasErrors)
                    {
                        // Process error here.
                    }
                }
            }
        }
    }
}