다음을 통해 공유


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

참고 항목

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

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

참고 항목

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

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

항목 설명
TableAdapter 만들기 및 구성 디자이너를 사용하여 TableAdapter를 만들고 구성하는 방법
매개 변수가 있는 TableAdapter 쿼리 만들기 사용자가 TableAdapter 프로시저 또는 쿼리에 인수를 제공할 수 있도록 하는 방법
TableAdapter를 사용하여 데이터베이스에 직접 액세스 TableAdapter의 Dbdirect 메서드를 사용하는 방법
데이터 세트를 채우는 동안 제약 조건 해제 데이터를 업데이트할 때 외래 키 제약 조건으로 작업하는 방법
TableAdapter의 기능 확장 방법 TableAdapter에 사용자 지정 코드를 추가하는 방법
XML 데이터를 데이터 세트에 읽어오기 XML 작업 방법

TableAdapter 개요

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

클라이언트 애플리케이션의 데이터 흐름

TableAdapter는 데이터 세트 디자이너를 사용하여 디자인되었지만 TableAdapter 클래스는 DataSet의 중첩 클래스로 생성되지 않습니다. 각 데이터 세트에 고유한 별도의 네임스페이스에 있습니다. 예를 들어 NorthwindDataSet라는 데이터 세트가 있는 경우 NorthwindDataSetDataTable에 연결된 TableAdapter는 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 마법사의 주 쿼리에서 사용할 수 있는 정보의 양에 따라 달라집니다. 예를 들어 JOIN을 사용하여 여러 테이블, 스칼라 값, 뷰 또는 집계 함수의 결과에서 값을 페치하도록 구성된 TableAdapter는 처음에 업데이트를 기본 데이터베이스로 다시 보내는 기능을 포함하여 생성되지 않습니다. 그러나 속성 창에서 INSERT, UPDATEDELETE 명령을 수동으로 구성할 수 있습니다.

TableAdapter 쿼리

쿼리가 여러 개 포함된 TableAdapter

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 상속

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

TableAdapter 메서드 및 속성

TableAdapter 클래스는 .NET 형식이 아닙니다. 즉, 설명서 또는 개체 브라우저에서 조회할 수 없습니다. 앞서 언급한 마법사 중 하나를 사용하는 경우 TableAdapter는 디자인 타임에 만들어집니다. TableAdapter를 만들 때 할당되는 이름은 작업 중인 테이블의 이름을 기준으로 합니다. 예를 들어 Orders라는 데이터베이스의 테이블을 기반으로 TableAdapter를 만들 경우 TableAdapter의 이름은 OrdersTableAdapter입니다. TableAdapter의 클래스 이름은 데이터 세트 디자이너이름 속성을 사용하여 변경할 수 있습니다.

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

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

TableAdapter 업데이트 메서드

TableAdapter는 데이터 명령을 사용하여 데이터베이스에서 읽고 씁니다. TableAdapter의 초기 Fill(주) 쿼리를 연결된 데이터 테이블의 스키마를 만드는 기준으로 사용하고 TableAdapter.Update 메서드와 연결된 InsertCommand, UpdateCommandDeleteCommand 명령도 사용합니다. TableAdapter의 Update 메서드를 호출하면 TableAdapter 쿼리 구성 마법사를 사용하여 추가한 추가 쿼리 중 하나가 아니라 TableAdapter를 원래 구성했을 때 생성된 문이 실행됩니다.

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

참고 항목

주 쿼리에 충분한 정보가 있으면 TableAdapter가 생성될 때 기본적으로 InsertCommand, UpdateCommandDeleteCommand 명령이 생성됩니다. TableAdapter의 주 쿼리가 단일 테이블 SELECT 문보다 많은 경우 디자이너에서 InsertCommand, UpdateCommandDeleteCommand를 생성할 수 없습니다. 이러한 명령이 생성되지 않으면 TableAdapter.Update 메서드를 실행할 때 오류가 발생할 수 있습니다.

TableAdapter GenerateDbDirectMethods

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

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

Nullable 형식에 대한 TableAdapter 지원

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

TableAdapterManager 참조

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

TableAdapterManager 클래스는 .NET 형식이 아닙니다. 따라서 설명서에서 조회할 수 없습니다. 이 클래스는 디자인 타임에 데이터 세트 생성 프로세스의 일부로 만들어집니다.

다음은 TableAdapterManager 클래스의 자주 사용되는 메서드 및 속성입니다.

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

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

보안

CommandType 속성이 Text로 설정된 데이터 명령을 사용하는 경우 클라이언트에서 보낸 정보를 데이터베이스에 전달하기 전에 신중하게 확인합니다. 악의적인 사용자가 인증되지 않은 액세스 권한을 얻거나 데이터베이스를 손상시키기 위해 수정되었거나 추가된 SQL 문을 전송(주입)할 수도 있습니다. 사용자 입력을 데이터베이스로 전송하기 전에 항상 정보가 유효한지 확인합니다. 가능하면 항상 매개 변수화된 쿼리 또는 저장 프로시저를 사용하는 것이 좋습니다.