다음을 통해 공유


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

비고

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

이 문서에서는 .NET Framework 데이터 세트의 테이블에서 데이터를 쿼리하고 편집하는 방법을 설명합니다. 모든 데이터베이스의 테이블을 편집하는 것과 마찬가지로 데이터 테이블의 데이터를 편집할 수 있습니다. 테이블에 레코드를 삽입, 업데이트 및 삭제할 수 있습니다. 데이터 바인딩된 양식에서 사용자가 편집할 수 있는 필드를 지정할 수 있습니다.

이러한 경우 데이터 바인딩 인프라는 변경 내용을 데이터베이스로 다시 보낼 수 있도록 모든 변경 내용 추적을 처리합니다. 프로그래밍 방식으로 데이터를 편집하고 변경 내용을 데이터베이스로 다시 보내려면 변경 내용 추적을 수행하는 개체와 메서드를 사용해야 합니다.

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

필수 조건

Visual Studio를 사용하여 .NET Framework 데이터 세트의 데이터를 쿼리하고 편집하려면 다음이 필요합니다.

데이터 세트의 행 편집

기존 행을 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 컨트롤새 추가 단추를 사용하여 새 레코드를 추가합니다.

NewRow 에서 DataTable 메서드를 호출하여 데이터 세트에 새 레코드를 추가할 수도 있습니다. DataRow 행을 Rows 컬렉션에 추가합니다.

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

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

northwindDataSet1.Customers.Rows.Add(newCustomersRow);

데이터 테이블에서 레코드 삭제

DataRowRemove 메서드를 호출하거나 DataRowCollection 개체의 Delete 메서드를 호출하여 DataRow을 삭제할 수 있습니다.

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

반대로 Delete 메서드는 DataRow를 실제로 제거하지는 않지만 삭제 대상으로 표시합니다. 메서드를 호출 AcceptChanges 할 때 실제 제거가 발생합니다. 실제로 삭제하기 전에 제거되도록 표시된 행을 프로그래밍 방식으로 확인할 수 있습니다.

데이터 세트가 데이터 원본에 업데이트를 전송하는 데 필요한 정보를 계속 저장하려면 데이터 테이블에서 Delete를 제거하기 위해 DataRow 메서드를 사용하십시오. 애플리케이션에서 TableAdapter 또는 DataAdapter를 사용하는 경우, Update 메서드는 RowState 값이 Deleted인 행을 삭제합니다.

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

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

비고

DataRowCollection의 개수 속성을 가져오면, 결과 개수에는 삭제 대상으로 표시된 레코드가 포함됩니다. 삭제하도록 표시되지 않은 레코드의 정확한 수를 얻으려면 컬렉션을 반복하고 각 레코드의 속성을 확인할 RowState 수 있습니다. 삭제로 표시된 레코드에는 RowStateDeleted로 설정되어 있습니다. 또는 행 상태를 기준으로 필터링하는 데이터 세트의 데이터 뷰를 만들고 해당 데이터 세트에서 count 속성을 가져올 수 있습니다.

변경된 행이 있는지 확인

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

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

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

  • 변경된 각 데이터 행에는 여러 버전이 포함됩니다. 변경 DataRowVersion 전의 원래 버전과 변경 후의 현재 버전이 포함됩니다. 변경이 보류 중인 상태에서 RowChanging 이벤트에 응답할 수 있으며, 동시에 세 번째로 제안된 버전도 사용할 수 있습니다.

변경된 행을 확인하려면 데이터 세트의 HasChanges 메서드를 호출합니다. 데이터 세트에서 변경된 경우 메서드가 반환 true 됩니다. 변경 내용이 있는지 확인하면 메서드를 GetChangesDataSet 호출하거나 DataTable 변경된 행 집합을 반환할 수 있습니다.

다음 예제에서는 메서드의 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에 오류가 있는지 검사할 수 있습니다.

데이터 세트의 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.
                    }
                }
            }
        }
    }
}