DataAdapter DataTable 및 DataColumn 매핑

DataAdapterTableMappings 속성에는 0개 이상의 DataTableMapping 개체 컬렉션이 있습니다. DataTableMapping은 데이터 원본에 대한 쿼리에서 반환된 데이터와 DataTable 간의 기본 매핑을 제공합니다. DataTableMapping 이름은 DataTable 이름 대신 DataAdapterFill 메서드에 전달될 수 있습니다. 다음 예제에서는 Authors 테이블에 대해 AuthorsMapping이라는 DataTableMapping을 만듭니다.

workAdapter.TableMappings.Add("AuthorsMapping", "Authors")  
workAdapter.TableMappings.Add("AuthorsMapping", "Authors");  

DataTableMapping을 통해 데이터베이스의 열 이름과 다른 DataTable의 열 이름을 사용할 수 있습니다. DataAdapter는 테이블이 업데이트될 때 매핑을 통해 열을 일치시킵니다.

DataAdapterFill 또는 Update 메서드를 호출할 때 TableName 또는 DataTableMapping 이름을 지정하지 않으면 DataAdapter가 "Table"이라는 DataTableMapping을 찾습니다. 해당 DataTableMapping이 없으면 DataTableTableName은 "Table"입니다. "Table"이라는 이름의 DataTableMapping을 만들어 기본 DataTableMapping을 지정할 수 있습니다.

다음 코드 예제에서는 System.Data.Common 네임스페이스에서 DataTableMapping을 만들고 이름을 "Table"로 지정하여 지정된 DataAdapter의 기본 매핑으로 설정합니다. 그런 다음, 쿼리 결과의 첫 번째 테이블(Northwind 데이터베이스의 Customers 테이블)에 있는 열을 DataSetNorthwind Customers 테이블에 있는, 사용자에게 더 친숙한 이름 세트로 매핑합니다. 매핑되지 않는 열의 경우 데이터 소스의 열 이름이 사용됩니다.

Dim mapping As DataTableMapping = _  
  adapter.TableMappings.Add("Table", "NorthwindCustomers")  
mapping.ColumnMappings.Add("CompanyName", "Company")  
mapping.ColumnMappings.Add("ContactName", "Contact")  
mapping.ColumnMappings.Add("PostalCode", "ZIPCode")  
  
adapter.Fill(custDS)  
DataTableMapping mapping =
  adapter.TableMappings.Add("Table", "NorthwindCustomers");  
mapping.ColumnMappings.Add("CompanyName", "Company");  
mapping.ColumnMappings.Add("ContactName", "Contact");  
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");  
  
adapter.Fill(custDS);  

나중에 같은 DataAdapter에서 다른 매핑을 사용하는 다른 테이블의 로드를 지원하도록 할 수도 있습니다. DataTableMapping 개체를 추가하기만 하면 이를 수행할 수 있습니다.

Fill 메서드에 DataSet의 인스턴스와 DataTableMapping 이름이 전달될 때 해당 이름의 매핑이 있으면 그 매핑이 사용되고, 그렇지 않으면 해당 이름의 DataTable이 사용됩니다.

다음 예제에서는 Customers라는 이름의 DataTableMappingBizTalkSchema라는 이름의 DataTable을 만듭니다. 그런 다음, SELECT 문에서 반환하는 행을 BizTalkSchemaDataTable에 매핑합니다.

Dim mapping As ITableMapping = _  
  adapter.TableMappings.Add("Customers", "BizTalkSchema")  
mapping.ColumnMappings.Add("CustomerID", "ClientID")  
mapping.ColumnMappings.Add("CompanyName", "ClientName")  
mapping.ColumnMappings.Add("ContactName", "Contact")  
mapping.ColumnMappings.Add("PostalCode", "ZIP")  
  
adapter.Fill(custDS, "Customers")  
ITableMapping mapping =
  adapter.TableMappings.Add("Customers", "BizTalkSchema");  
mapping.ColumnMappings.Add("CustomerID", "ClientID");  
mapping.ColumnMappings.Add("CompanyName", "ClientName");  
mapping.ColumnMappings.Add("ContactName", "Contact");  
mapping.ColumnMappings.Add("PostalCode", "ZIP");  
  
adapter.Fill(custDS, "Customers");  

참고 항목

열 매핑에 소스 열 이름을 제공하지 않거나 테이블 매핑에 소스 테이블 이름을 제공하지 않으면 기본 이름이 자동으로 생성됩니다. 열 매핑에 소스 열을 제공하지 않으면 SourceColumn1로 시작하는 증분 기본 이름인 SourceColumnN이 열 매핑에 제공됩니다. 테이블 매핑에 소스 테이블 이름을 제공하지 않으면 SourceTable1로 시작하는 증분 기본 이름인 SourceTableN이 테이블 매핑에 제공됩니다.

참고 항목

사용자가 제공하는 이름이 ColumnMappingCollection에 있는 기존의 기본 열 매핑 이름이나 DataTableMappingCollection에 있는 테이블 매핑 이름과 충돌할 수 있으므로, 열 매핑에 SourceColumnN을 제공하거나 테이블 매핑에 SourceTableN을 제공하는 명명 규칙은 사용하지 않는 것이 좋습니다. 이미 있는 이름을 제공하면 예외가 throw됩니다.

여러 개의 결과 집합 처리

SelectCommand가 여러 개의 테이블을 반환하면 FillDataSet의 테이블에 대해 지정된 테이블 이름으로 시작하여 TableNameN(TableName1로 시작) 형식으로 계속되는 증분 값을 갖는 테이블 이름을 자동으로 생성합니다. 테이블 매핑을 사용하여 자동 생성된 테이블 이름을 DataSet의 테이블에 대해 지정하려는 이름으로 매핑할 수 있습니다. 예를 들어, CustomersOrders라는 두 테이블을 반환하는 SelectCommand의 경우 Fill에 대해 다음과 같이 호출합니다.

adapter.Fill(customersDataSet, "Customers")  
adapter.Fill(customersDataSet, "Customers");  

두 테이블 CustomersCustomers1DataSet에서 만들어집니다. 테이블 매핑을 사용하면 두 번째 테이블이 Customers1 대신 Orders로 명명되도록 할 수 있습니다. 이를 수행하려면 다음 예제와 같이 Customers1의 소스 테이블을 DataSet 테이블 Orders로 매핑합니다.

adapter.TableMappings.Add("Customers1", "Orders")  
adapter.Fill(customersDataSet, "Customers")  
adapter.TableMappings.Add("Customers1", "Orders");  
adapter.Fill(customersDataSet, "Customers");  

참고 항목