다음을 통해 공유


.NET Framework 애플리케이션에서 데이터 세트 쿼리

참고 항목

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

데이터 세트에서 특정 레코드를 검색하려면 DataTable에서 FindBy 메서드를 사용하거나, 테이블의 Rows 컬렉션에서 반복되게 하는 자체 foreach 문을 작성하거나, LINQ to DataSet를 사용해야 합니다.

데이터 세트 대/소문자 구분

데이터 세트에서 테이블 및 열 이름은 기본적으로 대/소문자를 구분하지 않습니다. 즉 “Customers” 라는 데이터 세트의 테이블은 “customers”라고 해도 됩니다. 이는 SQL Server를 포함한 많은 데이터베이스의 명명 규칙과 일치합니다. SQL Server에서의 기본 동작은 데이터 요소의 이름을 대/소문자로만 구분할 수는 없다는 것입니다.

참고 항목

데이터 세트와 달리, XML 문서는 대/소문자를 구분하므로 스키마에 정의된 데이터 요소의 이름은 대/소문자를 구분합니다. 예를 들어 스키마 프로토콜을 사용하면 스키마에서 Customers라는 테이블과 customers라는 서로 다른 테이블을 정의할 수 있습니다. 따라서 대/소문자만 다른 요소가 포함된 스키마를 사용하여 데이터 세트 클래스를 생성하면 이름 충돌이 발생할 수 있습니다.

하지만 대/소문자 구분은 데이터 세트에서 데이터를 해석하는 방법이 될 수 있습니다. 예를 들어 데이터 세트 테이블에서 데이터를 필터링하는 경우, 비교할 때 대/소문자를 구분하는지 여부에 따라 검색 조건의 결과가 달라질 수 있습니다. 데이터 세트의 CaseSensitive 속성을 설정하여 필터링, 검색 및 정렬의 대/소문자 구분 여부를 제어할 수 있습니다. 데이터 세트의 모든 테이블은 기본적으로 이 속성의 값을 상속합니다. (테이블의 CaseSensitive 속성을 설정하여 개별 테이블에서 이 속성을 재정의할 수 있습니다.)

데이터 테이블에서 특정 행 찾기

형식화된 데이터 세트에서 기본 키 값을 사용하여 행을 찾으려면

  • 행을 찾으려면 테이블의 기본 키를 사용하는 강력한 형식의 FindBy 메서드를 호출해야 합니다.

    다음 예에서는 CustomerID 열이 Customers 테이블의 기본 키입니다. 생성된 FindBy 메서드가 FindByCustomerID라는 뜻입니다. 이 예제에서는 생성된 FindBy 메서드를 사용하여 변수에 특정 DataRow를 할당하는 방법을 확인할 수 있습니다.

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

형식화되지 않은 데이터 세트에서 기본 키 값을 사용하여 행을 찾으려면

  • DataRowCollection 컬렉션의 Find 메서드를 호출하여 기본 키를 매개 변수로서 전달합니다.

    다음 예에서는 foundRow라는 새 행을 선언하고 Find 메서드의 반환 값을 할당하는 방법을 확인할 수 있습니다. 기본 키가 있는 경우에는 열 인덱스 1의 내용이 메시지 상자에 표시됩니다.

    string s = "primaryKeyValue";
    DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s);
    
    if (foundRow != null) 
    {
        MessageBox.Show(foundRow[0].ToString());
    }
    else
    {
        MessageBox.Show("A row with the primary key of " + s + " could not be found");
    }
    

열 값으로 행 찾기

열의 값을 이용해 행을 찾으려면

  • 데이터 테이블은 Select 메서드로 전달된 식을 바탕으로 DataRow 배열을 반환하는 Select 메서드를 사용하여 생성됩니다. 유효한 식을 만드는 자세한 방법은 Expression 속성 관련 페이지의 "식 구문" 섹션을 참조하세요.

    다음 예제에서는 DataTableSelect 메서드를 사용하여 특정 열을 찾는 방법을 확인할 수 있습니다.

    DataRow[] foundRows;
    foundRows = dataSet1.Tables["Customers"].Select("CompanyName Like 'A%'");
    

데이터 세트의 테이블이 관련된 경우 DataRelation 개체는 관련 레코드를 다른 테이블에서 사용할 수 있게 합니다. 예를 들어 CustomersOrders 테이블을 포함하는 데이터 세트를 사용할 수 있습니다.

DataRelation 개체를 사용하면 부모 테이블에 있는 DataRowGetChildRows 메서드를 호출하여 관련 레코드를 찾을 수 있습니다. 이 메서드는 관련 자식 레코드의 배열을 반환합니다. 자식 테이블에 있는 DataRowGetParentRow 메서드를 호출해도 됩니다. 이 메서드는 부모 테이블에서 단일 DataRow를 반환합니다.

이 페이지에서는 형식화된 데이터 세트를 사용하는 예제를 제공합니다. 형식화 되지 않은 데이터 세트에서 관계를 탐색 하는 방법은 DataRelations 탐색을 참조하세요.

참고 항목

Windows Forms 애플리케이션에서 작업 중이고 데이터 바인딩 기능을 사용하여 데이터를 표시하는 경우, 디자이너에서 생성한 폼을 사용하면 애플리케이션에 충분한 기능을 제공할 수 있습니다. 자세한 내용은 Visual Studio에서 데이터에 컨트롤 바인딩을 참조하세요. 그중에서도 데이터 세트에서의 관계를 중점적으로 참조하세요.

다음 코드 예제에서는 형식화된 데이터 세트에서 위쪽 및 아래쪽 관계를 탐색하는 방법을 확인할 수 있습니다. 이 코드 예제에서는 형식화된 DataRow(NorthwindDataSet.OrdersRow)와 생성된 FindByPrimaryKey(FindByCustomerID) 메서드를 사용하여 원하는 행을 찾고 관련 레코드를 반환합니다. 이 예제는 다음이 있는 경우에만 올바르게 컴파일되고 실행됩니다.

  • Customers 테이블이 포함된 NorthwindDataSet라는 데이터 세트의 인스턴스.

  • Orders 테이블.

  • 두 테이블 간의 관계를 지정하는 FK_Orders_Customers라는 관계.

또한 반환될 레코드에 대한 데이터를 두 테이블에 입력해야 합니다.

선택한 부모 레코드의 자식 레코드를 반환하려면

  • 특정 Customers 데이터 행의 GetChildRows 메서드를 호출하고 Orders 테이블에서 행의 배열을 반환합니다.

    string custID = "ALFKI";
    NorthwindDataSet.OrdersRow[] orders;
    
    orders = (NorthwindDataSet.OrdersRow[])northwindDataSet.Customers.
        FindByCustomerID(custID).GetChildRows("FK_Orders_Customers");
    
    MessageBox.Show(orders.Length.ToString());
    

선택한 자식 레코드의 부모 레코드를 반환하려면

  • 특정 Orders 데이터 행의 GetParentRow 메서드를 호출하고 Customers 테이블에서 단일 행을 반환합니다.

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);