Correspondencias de DataTable y DataColumn en un objeto DataAdapter

DataAdapter contiene una colección con cero o más objetos DataTableMapping en su propiedad de TableMappings. Un objeto DataTableMapping proporciona una asignación principal entre los datos devueltos por una consulta realizada en un origen de datos y una DataTable. El nombre del objeto DataTableMapping se puede pasar en lugar del nombre de DataTable al método Fill de DataAdapter. En el ejemplo siguiente se crea un objeto DataTableMapping denominado AuthorsMapping en la tabla Authors.

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

Un objeto DataTableMapping permite usar en un objeto DataTable nombres de columna distintos a los de la base de datos. El objeto DataAdapter usa la asignación para hacer coincidir las columnas al actualizar la tabla.

Si no se especifica un nombre de TableName o DataTableMapping al llamar a los métodos Fill o Update del objeto DataAdapter, DataAdapter busca un objeto DataTableMapping denominado "Table". Si no existe ese objeto DataTableMapping, el nombre de TableName de DataTable es "Table". Puede especificar un objeto DataTableMapping predeterminado si crea una instancia de DataTableMapping con el nombre "Table".

En el ejemplo de código siguiente se crea un objeto DataTableMapping (del espacio de nombres System.Data.Common) y, al asignarle el nombre "Table", se convierte en la asignación predeterminada del objeto DataAdapter especificado. Después, en el ejemplo se asignan las columnas de la primera tabla de los resultados de la consulta (la tabla Customers de la base de datos Northwind) a un conjunto de nombres más descriptivos existentes en la tabla Northwind Customers de DataSet. En las columnas que no se asignan se usa el nombre de la columna en el origen de datos.

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

En situaciones más avanzadas, podría decidir que quiere que el mismo objeto DataAdapter permita la carga de otras tablas con otras asignaciones. Para ello, basta con agregar más objetos DataTableMapping.

Cuando al método Fill se le pasa una instancia de un objeto DataSet y un nombre de DataTableMapping, se usa una asignación con ese nombre, si existe, o bien un objeto DataTable con ese nombre.

En los ejemplos siguientes se crea un objeto DataTableMapping denominado Customers y un objeto DataTable con el nombre BizTalkSchema. A continuación, en el ejemplo se asignan las filas devueltas por la instrucción SELECT a la DataTable de 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");  

Nota

Si no se proporciona un nombre de columna de origen en una asignación de columnas o no se identifica un nombre de tabla de origen en una asignación de tablas, se generan nombres predeterminados de forma automática. Si no se proporciona una columna de origen en una asignación de columnas, la asignación de columnas recibe el nombre predeterminado secuencial SourceColumnN, comenzando por SourceColumn1. Si no se proporciona un nombre de tabla de origen en una asignación de tablas, la asignación de tabla recibe el nombre predeterminado secuencial SourceTableNN, comenzando por SourceTable1.

Nota

Es recomendable evitar la convención de nomenclatura de SourceColumnN para una asignación de columnas, o bien de SourceTableN para una asignación de tablas, ya que es posible que el nombre que se proporcione genere un conflicto con el nombre predeterminado de asignación de columnas de ColumnMappingCollection o con el nombre de asignación de tablas de DataTableMappingCollection. Si el nombre proporcionado ya existe, se iniciará una excepción.

Controlar varios conjuntos de resultados

Cuando SelectCommand devuelve varias tablas, Fill genera automáticamente nombres de tabla con valores incrementales para todas las tablas del objeto DataSet, comenzando por el nombre de tabla especificado y continuando con el formato TableNameN, a partir de TableName1. Puede usar asignaciones de tabla para asignar el nombre generado automáticamente a un nombre que quiera especificar para la tabla en el objeto DataSet. Por ejemplo, cuando SelectCommand devuelve dos tablas, Customers y Orders, puede emitir la llamada siguiente a Fill.

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

Se crean dos tablas en el objeto DataSet: Customers y Customers1. Puede usar asignaciones de tabla para asegurarse de que la segunda se denomina Orders en lugar de Customers1. Para ello, asigne la tabla de origen de Customers1 a la tabla Orders del objeto DataSet, como se muestra en el ejemplo siguiente.

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

Consulte también