Сопоставления DataAdapter, DataTable и DataColumn (ADO.NET)
Обновлен: November 2007
Сопоставление 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 не существует, то значением TableName для объекта 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");
Примечание. |
---|
Если имя исходного столбца не задано для сопоставления столбцов, или имя исходной таблицы не задано для сопоставления таблиц, то автоматически создаются имена, применяемые по умолчанию. Если ни один исходный столбец не предоставлен для сопоставления столбцов, то сопоставлению столбцов присваивается предусмотренное по умолчанию имя ИсходныйСтолбецN с автоматически увеличивающимся суффиксом, начиная с ИсходныйСтолбец1. Если ни одно имя исходной таблицы не предоставлено для сопоставления таблиц, то сопоставлению таблиц присваивается предусмотренное по умолчанию имя ИсходнаяТаблицаN с автоматически увеличивающимся суффиксом, начиная с ИсходнаяТаблица1. |
Примечание. |
---|
Рекомендуется избегать использования соглашения об именах ИсходныйСтолбецN для сопоставления столбцов или ИсходнаяТаблицаN для сопоставления таблиц, поскольку заданное имя может конфликтовать с существующим именем заданного по умолчанию сопоставления столбцов в коллекции ColumnMappingCollection или с именем сопоставления таблиц в коллекции DataTableMappingCollection. Если указанное имя уже существует, возникает исключение. |
Обработка нескольких результирующих наборов
Если команда SelectCommand возвращает несколько таблиц, то в методе Fill для таблиц в объекте DataSet автоматически формируются имена, которые в качестве суффиксов имеют автоматически увеличивающиеся значения. Значения начинаются с указанного имени таблицы и увеличиваются в форме ИмяТаблицыN, причем первым значением является ИмяТаблицы1. Можно использовать сопоставления таблиц для сопоставления автоматически создаваемого имени таблицы с тем именем, которое требуется задать для таблицы в объекте DataSet. Например, для к команды SelectCommand, которая возвращает две таблицы, Customers и Orders, можно выполнить следующий вызов метода Fill.
adapter.Fill(customersDataSet, "Customers")
В объекте DataSet будут созданы две таблицы: Customers и Customers1. Можно использовать сопоставления таблиц для обеспечения того, чтобы вторая таблица получила имя Orders вместо Customers1. Для этого необходимо сопоставить исходную таблицу Customers1 с таблицей Orders из DataSet, как показано в следующем примере.
adapter.TableMappings.Add("Customers1", "Orders")
adapter.Fill(customersDataSet, "Customers")