Asignaciones de objetos DataAdapter, DataTable y DataColumn
Se aplica a: .NET Framework .NET .NET Standard
Un objeto SqlDataAdapter 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 instancia de DataTable. El nombre de DataTableMapping se puede pasar en lugar del nombre de DataTable al método Fill del objeto DataAdapter. En el ejemplo siguiente se crea un objeto DataTableMapping denominado AuthorsMapping en la tabla 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.
Nota
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 valor 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.
// 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);
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, agregue 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. Después, en el ejemplo se asignan las filas devueltas por la instrucción SELECT al objeto 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);
Nota:
Si no se proporciona un nombre de columna de origen para una asignación de columnas, se generarán nombres predeterminados de forma automática. Si no se proporciona una columna de origen para una asignación de columnas, la asignación de columnas recibe un nombre predeterminado secuencial de SourceColumn N, comenzando por SourceColumn1.
Nota:
Si no se proporciona un nombre de tabla de origen para una asignación de tabla, se generarán nombres predeterminados de forma automática. Si no se proporciona un nombre de tabla de origen para una asignación de tablas, la asignación de tablas recibe un nombre predeterminado secuencial de SourceTable N, comenzando por SourceTable1.
Nota:
Es recomendable evitar la convención de nomenclatura de SourceColumn N para una asignación de columnas, o bien de SourceTable N para una asignación de tablas, ya que es posible que el nombre proporcionado entre en 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.
Control de varios conjuntos de resultados
Cuando SelectCommand devuelve varias tablas, Fill genera automáticamente nombres de tabla con valores secuenciales para todas las tablas del objeto DataSet, comenzando por el nombre de tabla especificado y continuando con el formato TableName N, 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");
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.
// 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");