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


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

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

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

A DataTableMapping позволяет использовать имена столбцов в DataTable, где они отличаются от имен в базе данных. Сопоставление DataAdapter используется для соотнесения столбцов при обновлении таблицы.

Если при вызове метода Fill или Update объекта DataAdapter не указано TableName или DataTableMapping имя, DataAdapter осуществляется поиск DataTableMapping с именем "Таблица". Если это DataTableMapping не существует, TableNameDataTable - "Таблица". Можно указать значение по умолчанию для 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, с 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");

Примечание.

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

Примечание.

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

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

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

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

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

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

См. также