다음을 통해 공유


.NET Framework 애플리케이션에서 TableAdapters를 사용하여 데이터 세트 채우기

메모

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

TableAdapter 구성 요소는 지정한 하나 이상의 쿼리 또는 저장 프로시저에 따라 데이터 세트를 데이터베이스의 데이터로 채웁니다. 또한 TableAdapters는 데이터베이스에 대한 추가, 업데이트 및 삭제를 수행하여 데이터 세트에 대한 변경 내용을 유지할 수 있습니다. 또한 특정 테이블과 관련이 없는 전역 명령을 실행할 수 있습니다.

메모

Visual Studio 디자이너는 TableAdapters를 생성합니다. 프로그래밍 방식으로 데이터 세트를 만드는 경우 DataAdapter .NET 클래스를 사용합니다.

TableAdapter 작업에 대한 자세한 내용은 다음 문서 중 하나로 직접 건너뛸 수 있습니다.

기사 묘사
TableAdapters 만들기 및 구성 디자이너를 사용하여 TableAdapters를 만들고 구성하는 방법을 알아봅니다.
매개 변수가 있는 TableAdapter 쿼리 만들기 사용자가 TableAdapter 프로시저 또는 쿼리에 인수를 제공할 수 있도록 하는 방법을 알아봅니다.
TableAdapter 사용하여 데이터베이스에 직접 액세스 TableAdapters의 DbDirect 메서드를 사용하는 방법을 알아봅니다.
데이터 세트를 채우는 동안 제약 조건 끄기 데이터를 업데이트할 때 외래 키 제약 조건을 사용하는 방법을 알아봅니다.
TableAdapter의 기능 확장 TableAdapters에 사용자 지정 코드를 추가하는 방법을 알아봅니다.
XML 데이터를 데이터 세트 에 읽기 데이터 세트에서 XML 데이터를 사용하는 방법을 알아봅니다.

TableAdapter 개요

TableAdapters는 데이터베이스에 연결하고, 쿼리 또는 저장 프로시저를 실행하고, DataTable을 반환된 데이터로 채우는 디자이너 생성 구성 요소입니다. 또한 TableAdapters는 애플리케이션에서 데이터베이스로 업데이트된 데이터를 다시 보냅니다. 연결된 테이블의 스키마를 준수하는 데이터를 반환하는 한 TableAdapter에서 원하는 만큼 쿼리를 실행할 수 있습니다. 다음 다이어그램에서는 TableAdapters가 메모리의 데이터베이스 및 기타 개체와 상호 작용하는 방법을 보여 줍니다.

클라이언트 애플리케이션의 TableAdapter 데이터 흐름을 보여 주는 다이어그램

TableAdapters는 데이터 세트 디자이너를 사용하여 설계되었지만 TableAdapter 클래스는 DataSet중첩 클래스로 생성되지 않습니다. 대신 각 데이터 세트와 관련된 별도의 네임스페이스에 있습니다. 예를 들어, NorthwindDataSet라는 데이터 세트가 있는 경우, DataTableNorthwindDataSet 개체와 연결된 TableAdapters는 NorthwindDataSetTableAdapters 네임스페이스에 있습니다. 프로그래밍 방식으로 특정 TableAdapter에 액세스하려면 TableAdapter 클래스의 새 인스턴스를 선언합니다. 예를 들어:

NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

연결된 DataTable 스키마

TableAdapter를 만들 때 초기 쿼리 또는 저장 프로시저를 사용하여 TableAdapter의 연결된 DataTable스키마를 정의합니다. TableAdapter의 관련된 Fill을 채우기 위해 TableAdapter의 DataTable 메서드를 호출하여 이 초기 쿼리 또는 저장 프로시저를 실행합니다. TableAdapter의 기본 쿼리에 대한 변경 내용은 연결된 데이터 테이블의 스키마에 반영됩니다. 예를 들어 기본 쿼리에서 열을 제거하면 데이터 세트 디자이너도 연결된 데이터 테이블에서 열을 제거합니다. TableAdapter의 추가 쿼리에서 기본 쿼리에 없는 열을 반환하는 SQL 문을 사용하는 경우 데이터 세트 디자이너는 기본 쿼리와 추가 쿼리 간에 열 변경 내용을 동기화하려고 시도합니다.

TableAdapter 업데이트 명령

TableAdapter의 업데이트 기능은 TableAdapter 마법사주 쿼리에서 사용할 수 있는 정보의 양에 따라 달라집니다. 예를 들어 여러 테이블에서 값을 가져오도록 구성된 TableAdapters(JOIN사용), 스칼라 값, 뷰 또는 집계 함수의 결과는 처음에 기본 데이터베이스로 업데이트를 다시 보낼 수 있는 기능으로 만들어지지 않습니다. 그러나 속성 창에서 InsertCommand, UpdateCommand, 그리고 DeleteCommand 속성을 수동으로 설정할 수 있습니다.

TableAdapter 쿼리

TableAdapters는 연결된 데이터 테이블을 채우기 위해 여러 쿼리를 포함할 수 있습니다. 각 쿼리가 연결된 데이터 테이블과 동일한 스키마를 준수하는 데이터를 반환하는 한 애플리케이션에 필요한 만큼 TableAdapter에 대한 쿼리를 정의할 수 있습니다. 이 기능을 사용하면 TableAdapter가 서로 다른 조건에 따라 다른 결과를 로드할 수 있습니다.

여러 쿼리가 있는 TableAdapter를 보여 주는 다이어그램

예를 들어 애플리케이션에 고객 이름이 포함된 테이블이 포함된 경우 특정 문자로 시작하는 모든 고객 이름으로 테이블을 채우는 쿼리를 만들 수 있습니다. 동일한 상태에 있는 모든 고객으로 테이블을 채우는 다른 쿼리를 만들 수 있습니다. 지정된 상태의 고객으로 Customers 테이블을 채우려면 다음과 같이 상태 값에 대한 매개 변수를 사용하는 FillByState 쿼리를 만듭니다. SELECT * FROM Customers WHERE State = @State. FillByState 메서드를 호출하고 매개 변수 값(예: CustomerTableAdapter.FillByState("WA"))을 전달하여 쿼리를 실행합니다.

TableAdapter의 데이터 테이블과 동일한 스키마의 데이터를 반환하는 쿼리를 추가하는 것 외에도 스칼라(단일) 값을 반환하는 쿼리를 추가할 수 있습니다. 예를 들어 반환된 데이터가 테이블의 스키마를 준수하지 않더라도 고객 수(SELECT Count(*) From Customers)를 반환하는 쿼리는 CustomersTableAdapter유효합니다.

ClearBeforeFill 속성

기본적으로 TableAdapter의 데이터 테이블을 채우기 위해 쿼리를 실행할 때마다 기존 데이터가 지워지고 쿼리 결과만 테이블에 로드됩니다. 쿼리가 반환하는 데이터를 데이터 테이블의 기존 데이터에 추가하거나 병합하려면 TableAdapter의 ClearBeforeFill 속성을 false설정합니다. 데이터를 지울지 여부에 관계없이 업데이트를 유지하려면 데이터베이스에 업데이트를 명시적으로 다시 보내야 합니다. 따라서 테이블을 채우는 다른 쿼리를 실행하기 전에 테이블의 데이터에 대한 변경 내용을 저장해야 합니다. 자세한 내용은 TableAdapter 사용하여 데이터 업데이트참조하세요.

TableAdapter 상속 기능

TableAdapters는 구성된 DataAdapter 클래스를 캡슐화하여 표준 데이터 어댑터의 기능을 확장합니다. 기본적으로 TableAdapter는 Component 클래스에서 상속되며 DataAdapter 클래스로 캐스팅할 수 없습니다. TableAdapter를 DataAdapter 클래스로 캐스팅하면 InvalidCastException 오류가 발생합니다. TableAdapter의 기본 클래스를 변경하려면 데이터 세트 디자이너에서 TableAdapter의 Component 속성에 있는 클래스에서 파생되는 클래스를 지정합니다.

TableAdapter 메서드 및 속성

TableAdapter 클래스는 .NET 형식이 아니으므로 개체 브라우저 또는 참조 설명서에서 찾을 수 없습니다. Visual Studio는 이전에 설명한 마법사 중 하나를 사용할 때 디자인 타임에 만듭니다. Visual Studio에서 만든 TableAdapter에 할당하는 이름은 작업 중인 테이블의 이름을 기반으로 합니다. 예를 들어 Orders데이터베이스의 테이블을 기반으로 TableAdapter를 만들 때 TableAdapter의 이름은 OrdersTableAdapter. TableAdapter의 클래스 이름을 변경하려면 데이터 세트 디자이너의 속성 창에서 Name 속성을 사용합니다.

TableAdapter의 일반적으로 사용되는 메서드 및 속성은 다음과 같습니다.

구성원 묘사
TableAdapter.Fill TableAdapter의 연결된 데이터 테이블을 TableAdapter의 SELECT 명령의 결과로 채웁니다.
TableAdapter.Update 변경 내용을 데이터베이스로 다시 보내고 업데이트의 영향을 받는 행 수를 나타내는 정수를 반환합니다. 자세한 내용은 TableAdapter 사용하여 데이터 업데이트참조하세요.
TableAdapter.GetData 데이터로 채워진 새 DataTable 반환합니다.
TableAdapter.Insert 데이터 테이블에 새 행을 만듭니다. 자세한 내용은 데이터베이스새 레코드 삽입을 참조하세요.
TableAdapter.ClearBeforeFill Fill 메서드 중 하나를 호출하기 전에 데이터 테이블이 비워지는지 여부를 결정합니다.

TableAdapter 업데이트 메서드

TableAdapters는 데이터 명령을 사용하여 데이터베이스에서 읽고 씁니다. TableAdapter의 초기 Fill(기본) 쿼리를 연결된 데이터 테이블의 스키마를 만들기 위한 기준으로 사용하고 InsertCommand 메서드와 연결된 UpdateCommand, DeleteCommandTableAdapter.Update 명령을 사용합니다. TableAdapter의 Update 메서드를 호출하면, TableAdapter가 처음 구성되었을 때 생성된 문이 실행됩니다. TableAdapter 쿼리 구성 마법사에서 추가한 추가 쿼리 중 하나는 실행되지 않습니다.

TableAdapter를 사용하는 경우 일반적으로 수행하는 명령으로 동일한 작업을 효과적으로 수행합니다. 예를 들어 어댑터의 Fill 메서드를 호출할 때 어댑터는 SelectCommand 속성에서 데이터 명령을 실행하고 데이터 판독기(예: SqlDataReader)를 사용하여 결과 집합을 데이터 테이블에 로드합니다. 마찬가지로 어댑터의 Update 메서드를 호출할 때 데이터 테이블의 변경된 각 레코드에 대해 적절한 명령(UpdateCommand, InsertCommandDeleteCommand 속성)을 실행합니다.

메모

기본 쿼리에 충분한 정보가 포함된 경우 디자이너는 디자이너가 TableAdapter를 생성할 때 기본적으로 InsertCommand, UpdateCommandDeleteCommand 명령을 만듭니다. 그러나 TableAdapter의 기본 쿼리가 단일 테이블 SELECT 문 이상인 경우 디자이너에서 이러한 명령을 생성하지 못할 수 있습니다. 이러한 경우 TableAdapter.Update 메서드를 실행할 때 오류가 발생할 수 있습니다.

TableAdapter 데이터베이스 직접 메서드 생성

InsertCommand, UpdateCommandDeleteCommand외에도 데이터베이스에 대해 직접 실행할 수 있는 메서드인 TableAdapter.Insert, TableAdapter.UpdateTableAdapter.Delete사용하여 TableAdapters를 만듭니다. 이러한 메서드를 직접 호출하여 데이터베이스의 데이터를 조작할 수 있습니다. 이렇게 하면 연결된 데이터 테이블에 대해 보류 중인 삽입, 업데이트 및 삭제를 처리하기 위해 TableAdapter.Update 호출하는 대신 코드에서 이러한 개별 메서드를 호출할 수 있습니다.

이러한 직접 메서드를 만들지 않으려면 TableAdapter의 GenerateDbDirectMethods 속성을 속성 창에서 false 설정합니다. TableAdapter에 추가된 추가 쿼리는 이러한 메서드를 생성하지 않는 독립 실행형 쿼리입니다.

nullable 형식에 대한 TableAdapter 지원

TableAdapters는 nullable 형식 Nullable<T>T?지원합니다. Visual Basic의 nullable 형식에 대한 자세한 내용은 Nullable 값 형식(Visual Basic)참조하세요. C#의 nullable 형식에 대한 자세한 내용은 Nullable 값 형식(C#)참조하세요.

TableAdapterManager 참조

기본적으로 Visual Studio는 관련 테이블을 포함하는 데이터 세트를 만들 때 TableAdapterManager 클래스를 생성합니다. 클래스가 생성되지 않도록 하려면 데이터 세트의 Hierarchical Update 속성 값을 false변경합니다. 관계가 있는 테이블을 Windows Form 또는 WPF 페이지의 디자인 화면으로 끌면 Visual Studio에서 클래스의 멤버 변수를 선언합니다. 데이터 바인딩을 사용하지 않는 경우 변수를 수동으로 선언해야 합니다.

TableAdapterManager 클래스는 .NET 형식이 아니므로 참조 설명서에 표시되지 않습니다. Visual Studio는 디자인 타임에 데이터 세트 만들기 프로세스의 일부로 만듭니다.

다음 표에서는 TableAdapterManager 클래스의 자주 사용되는 메서드 및 속성을 나열합니다.

구성원 묘사
UpdateAll 메서드 모든 데이터 테이블의 모든 데이터를 저장합니다.
BackUpDataSetBeforeUpdate 속성 TableAdapterManager.UpdateAll method.Boolean실행하기 전에 데이터 세트의 백업 복사본을 만들지 여부를 결정합니다.
tableNameTableAdapter 속성 TableAdapter를 나타냅니다. 생성된 TableAdapterManager에는 관리하는 각 TableAdapter 대한 속성이 포함되어 있습니다. 예를 들어 Customers 및 Orders 테이블이 있는 데이터 세트는 CustomersTableAdapterOrdersTableAdapter 속성이 포함된 TableAdapterManager를 사용하여 생성합니다.
UpdateOrder 속성 개별 삽입, 업데이트 및 삭제 명령의 순서를 제어합니다. 이 속성을 TableAdapterManager.UpdateOrderOption 열거형의 값 중 하나로 설정합니다.

기본적으로 UpdateOrderInsertUpdateDelete설정됩니다. 즉, 데이터 세트의 모든 테이블에 대해 삽입, 업데이트 및 삭제가 수행됩니다.

안전

CommandType 속성이 Text설정된 데이터 명령을 사용하는 경우 데이터베이스에 전달하기 전에 클라이언트에서 보낸 정보를 주의 깊게 확인합니다. 악의적인 사용자는 데이터베이스에 무단으로 액세스하기 위해 수정된 문을 보내거나 추가 SQL 문을 보내려고 할 수 있습니다. 사용자 입력을 데이터베이스로 전송하기 전에 항상 정보가 유효한지 확인합니다. 가능한 경우 매개 변수가 있는 쿼리 또는 저장 프로시저를 사용하는 것이 가장 좋습니다.