Поделиться через


Сопоставления DataAdapter DataTable и DataColumn

DataAdapter содержит коллекцию нулевых или более DataTableMapping объектов в свойстве TableMappings. DataTableMapping обеспечивает основное сопоставление данных, возвращаемых из запроса к источнику данных, и .DataTable Имя DataTableMapping можно передать вместо имени DataTable методу Fill объекта DataAdapter. В следующем примере создается экземпляр класса DataTableMapping с именем AuthorsMapping для таблицы Authors.

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

Класс DataTableMapping позволяет использовать имена столбцов в объекте DataTable, отличные от таковых в базе данных. В сопоставлении DataAdapter это сопоставление используется для согласования столбцов при обновлении таблицы.

Если не указан объект TableName или имя DataTableMapping при вызове метода Fill или Update объекта DataAdapter, то в объекте DataAdapter выполняется поиск экземпляра DataTableMapping с именем "Table". Если значение DataTableMapping не существует, имя таблицы dataTable имеет значение Table. Можно указать применяемый по умолчанию класс DataTableMapping при создании объекта DataTableMapping с именем "Table".

В следующем примере кода создается экземпляр DataTableMapping (из пространства имен System.Data.Common) и задается в качестве применяемого по умолчанию отображения для указанного объекта DataAdapter путем присваивания ему имени "Table". Затем в этом примере столбцы из первой таблицы в результатах запроса (таблицы Customers базы данных Northwind) сопоставляются с набором понятных для пользователя имен в таблице Northwind Customers в DataSet. Для столбцов, к которым не применяется сопоставление, используются имена столбцов из источника данных.

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 с этим именем.

В следующих примерах создается экземпляр DataTableMapping с именем Customers и именем объекта DataTable, равным BizTalkSchema. Затем в этом примере строки, возвращаемые инструкцией SELECT, сопоставляются с объектом DataTable, имеющим имя BizTalkSchema.

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");  

Примечание.

Если имя исходного столбца не задано для сопоставления столбцов, или имя исходной таблицы не задано для сопоставления таблиц, то автоматически создаются имена, применяемые по умолчанию. Если исходный столбец не указан для сопоставления столбцов, сопоставление столбцов получает добавочное имя по умолчанию SourceColumn N, начиная с SourceColumn1. Если для сопоставления таблиц не указано имя исходной таблицы, сопоставление таблиц получает добавочное имя по умолчанию SourceTable N, начиная с SourceTable1.

Примечание.

Рекомендуется избегать использования соглашения об именах SourceColumn N для сопоставления столбцов или SourceTable N для сопоставления таблиц, поскольку заданное имя может конфликтовать с существующим именем заданного по умолчанию сопоставления столбцов в коллекции ColumnMappingCollection или с именем сопоставления таблиц в коллекции DataTableMappingCollection. Если указанное имя уже существует, возникает исключение.

Обработка нескольких результирующих наборов

Если команда SelectCommand возвращает несколько таблиц, то в методе Fill для таблиц в объекте DataSet автоматически формируются имена, которые в качестве суффиксов имеют автоматически увеличивающиеся значения. Значения начинаются с указанного имени таблицы и увеличиваются в форме TableName N, первым значением является TableName1. Можно использовать сопоставления таблиц для сопоставления автоматически создаваемого имени таблицы с тем именем, которое требуется задать для таблицы в объекте DataSet. Например, для к команды SelectCommand, которая возвращает две таблицы, Customers и Orders, можно выполнить следующий вызов метода Fill.

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

В наборе данных создаются две таблицы: Клиенты и клиенты1. Можно использовать сопоставления таблиц для обеспечения того, чтобы вторая таблица получила имя Orders вместо Customers1. Для этого необходимо сопоставить исходную таблицу Customers1 с таблицей Orders из DataSet, как показано в следующем примере.

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

См. также