Configurar las asignaciones de DataTable y DataColumn
DataAdapter contiene una colección con cero o más objetos DataTableMapping en su propiedad 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 MyAuthors.
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors")
[C#]
workAdapter.TableMappings.Add("AuthorsMapping", "MyAuthors");
Un objeto DataTableMapping permite usar en un DataTable nombres de columna distintos a los de la base de datos. DataAdapter usa la asignación para hacer coincidir las columnas al actualizar la tabla.
Si no especifica un nombre de TableName o de DataTableMapping al llamar a los métodos Fill o Update de DataAdapter, DataAdapter busca un objeto DataTableMapping denominado "Table". Si no existe ese objeto DataTableMapping, el nombre de TableName de DataTable será "Table". Puede especificar un objeto DataTableMapping predeterminado si crea un DataTableMapping denominado "Table".
En el ejemplo de código siguiente se crea un DataTableMapping (a partir del espacio de nombres System.Data.Common) y, al darle el nombre "Table", lo convierte en la asignación predeterminada del DataAdapter especificado. A continuación, en el ejemplo se asignan las columnas de la primera tabla de 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 del DataSet. En las columnas que no se asignan se usa el nombre de la columna en el origen de datos.
Dim custMap As DataTableMapping = custDA.TableMappings.Add("Table", "NorthwindCustomers")
custMap.ColumnMappings.Add( "CompanyName", "Company")
custMap.ColumnMappings.Add( "ContactName", "Contact")
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode")
custDA.Fill(custDS)
[C#]
DataTableMapping custMap = custDA.TableMappings.Add("Table", "NorthwindCustomers");
custMap.ColumnMappings.Add( "CompanyName", "Company");
custMap.ColumnMappings.Add( "ContactName", "Contact");
custMap.ColumnMappings.Add( "PostalCode", "ZIPCode");
custDA.Fill(custDS);
En situaciones más avanzadas, puede que desee que el mismo DataAdapter permita la carga de distintas tablas, cada una con sus propias asignaciones. Para ello, basta con agregar más objetos DataTableMapping.
Cuando al método Fill se le pasa una instancia de un DataSet y un nombre de DataTableMapping, se usa la asignación de ese nombre, si existe, o un DataTable con ese nombre, en caso contrario.
En los ejemplos siguientes se crea un DataTableMapping denominado Customers y una DataTable denominada BizTalkSchema. En el ejemplo se asignan a continuación las filas devueltas por la instrucción SELECT a la DataTable BizTalkSchema.
Dim bizMap As ITableMapping = custDA.TableMappings.Add("Customers", "BizTalkSchema")
bizMap.ColumnMappings.Add( "CustomerID", "ClientID")
bizMap.ColumnMappings.Add( "CompanyName", "ClientName")
bizMap.ColumnMappings.Add( "ContactName", "Contact")
bizMap.ColumnMappings.Add( "PostalCode", "ZIP")
custDA.Fill(custDS, "Customers")
[C#]
ITableMapping bizMap = custDA.TableMappings.Add("Customers", "BizTalkSchema");
bizMap.ColumnMappings.Add( "CustomerID", "ClientID");
bizMap.ColumnMappings.Add( "CompanyName", "ClientName");
bizMap.ColumnMappings.Add( "ContactName", "Contact");
bizMap.ColumnMappings.Add( "PostalCode", "ZIP");
custDA.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 columna 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 SourceTableN, comenzando por "SourceTable1".
Es aconsejable evitar el uso del nombre "SourceColumnN" al suministrar un nombre de columna de origen a una asignación de columnas o "SourceTableN" al suministrar un nombre de tabla de origen en una asignación de tablas, ya que el nombre proporcionado puede crear un conflicto con otro nombre predeterminado de asignación de columna existente en ColumnMappingCollection o con un nombre de asignación de tabla de la colección DataTableMappingCollection. Si el nombre proporcionado ya existe, se iniciará una excepción.
Múltiples conjuntos de resultados
Cuando SelectCommand devuelve varias tablas, Fill genera automáticamente nombres de tabla con valores secuenciales para todas las tablas del DataSet, comenzando por el nombre de tabla especificado (por ejemplo "TableName1") y continuando con el nombre TableNameN. Puede usar asignaciones de tabla para asignar el nombre generado automáticamente a un nombre que desee especificar para la tabla en el DataSet. Por ejemplo, en el caso de un SelectCommand que devuelve dos tablas, Customers y Orders, puede emitir la llamada siguiente a Fill.
custDA.Fill(custDS, "Customers")
Se crean dos tablas en el 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 DataSet, como se muestra en el ejemplo siguiente.
custDA.TableMappings.Add("Customers1", "Orders")
custDA.Fill(custDS, "Customers")
Vea también
Utilizar proveedores de datos de .NET Framework para obtener acceso a datos | DataSet (Clase) | DataTable (Clase) | DataTableCollection (Clase) | DataTableMappingCollection (Clase) | OleDbDataAdapter (Clase) | OdbcDataAdapter (Clase) | SqlDataAdapter (Clase)