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


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

Применимо: платформа .NET Framework .NET Standard

Скачать ADO.NET

Сопоставление SqlDataAdapter содержит коллекцию, имеющую от нуля или больше объектов DataTableMapping, в своем свойстве TableMappings. Класс DataTableMapping предоставляет главное сопоставление между данными, возвращенными запросом к источнику данных, и DataTable. Имя DataTableMapping может быть передано вместо имени DataTable в метод Fill сопоставления DataAdapter. В следующем примере создается экземпляр класса DataTableMapping с именем 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. Для столбцов, к которым не применяется сопоставление, используются имена столбцов из источника данных.

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

DataTableMapping mapping =
    custAdapter.TableMappings.Add("Table", "NorthwindCustomers");
mapping.ColumnMappings.Add("CompanyName", "Company");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIPCode");

custAdapter.Fill(custDataSet);

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

Если методу Fill передается экземпляр DataSet и имя DataTableMapping, то при наличии сопоставления с этим именем используется это сопоставление; в противном случае используется объект DataTable с этим именем.

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

// Assumes that connection is a valid SqlConnection object.
DataSet custDataSet = new DataSet();

SqlDataAdapter custAdapter = new SqlDataAdapter(
    "SELECT * FROM dbo.Customers", connection);

// The DataTableMapping is implemented ITableMapping.
ITableMapping mapping =
    custAdapter.TableMappings.Add("Table", "BizTalkSchema");
mapping.ColumnMappings.Add("CustomerID", "ClientID");
mapping.ColumnMappings.Add("CompanyName", "ClientName");
mapping.ColumnMappings.Add("ContactName", "Contact");
mapping.ColumnMappings.Add("PostalCode", "ZIP");

custAdapter.Fill(custDataSet);

Примечание.

Если для сопоставления столбцов не указано имя исходного столбца, будут автоматически созданы имена по умолчанию. Если ни один исходный столбец не предоставлен для сопоставления столбцов, то сопоставлению столбцов присваивается предусмотренное по умолчанию имя 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");

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

// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT * FROM dbo.Customers; SELECT * FROM dbo.Orders;";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

DataSet customersDataSet = new DataSet();

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

См. также