Rellenar un conjunto de datos a partir de un objeto DataAdapter
Se aplica a: .NET Framework .NET .NET Standard
El objeto DataSet de ADO.NET es una representación de datos residente en memoria que proporciona un modelo de programación relacional coherente independiente del origen de datos. DataSet
representa un conjunto completo de datos que incluye tablas, restricciones y relaciones entre las tablas. Dado que DataSet
es independiente del origen de datos, DataSet
puede incluir datos locales de la aplicación y datos de otros muchos orígenes. La interacción con los orígenes de datos existentes se controla mediante el DataAdapter
.
La propiedad SelectCommand
de DataAdapter
es un objeto Command
que recupera datos del origen de datos. Las propiedades InsertCommand
, UpdateCommand
y DeleteCommand
de DataAdapter
son objetos Command
que permiten administrar las actualizaciones de los datos en el origen de datos para reflejar las modificaciones efectuadas en los datos de DataSet
. Estas propiedades se describen con más detalle en Actualización de orígenes de datos con objetos DataAdapter.
El método Fill
de DataAdapter
se usa para rellenar un objeto DataSet
con los resultados del elemento SelectCommand
de DataAdapter
. Fill
toma como argumentos un elemento DataSet
que se debe rellenar y un objeto DataTable
o el nombre del objeto DataTable
que se debe rellenar con las filas que devuelve SelectCommand
.
Nota:
El uso de DataAdapter
para recuperar la totalidad de una tabla lleva tiempo, en especial si la tabla incluye un gran número de filas. Esto se debe a que el acceso a la base de datos, la localización y el procesamiento de los datos, y la posterior transferencia de los mismos al cliente son procesos largos. La extracción de la tabla completa al cliente también bloquea todas las filas en el servidor. Para mejorar el rendimiento, puede usar la cláusula WHERE
para reducir en gran medida el número de filas que se devuelven al cliente. También puede reducir la cantidad de datos que se devuelven al cliente si enumera de forma explícita las columnas necesarias en la instrucción SELECT
. Otra solución consiste en recuperar las filas por lotes (por ejemplo varios cientos de filas de una vez) y recuperar solo el siguiente lote cuando el cliente haya finalizado con el lote actual.
El método Fill
utiliza el objeto DataReader
de forma implícita para devolver los nombres y tipos de columna que se usan para crear las tablas de DataSet
, y los datos para rellenar las filas de las tablas en DataSet
. Las tablas y columnas solo se crean cuando no existen; en caso contrario, Fill
utiliza el esquema existente de DataSet
. Los tipos de columna se crean como tipos de .NET Framework en función de las tablas en Asignaciones de tipos de datos en ADO.NET. No se crean claves principales a menos que existan en el origen de datos y DataAdapter
.MissingSchemaAction
se establezca en MissingSchemaAction
.AddWithKey
. Si el método Fill
encuentra que una tabla tiene una clave principal, sobrescribe los datos de DataSet
con los del origen de datos en las filas donde los valores de columna de clave principal coinciden con los de la fila que devuelve el origen de datos. Si no se detecta ninguna clave principal, los datos se agregan a las tablas de DataSet
. Fill
usa las asignaciones que puedan existir al rellenar DataSet
(vea Asignaciones de objetos DataAdapter, DataTable y DataColumn).
Nota:
Si SelectCommand
devuelve los resultados de OUTER JOIN, DataAdapter
no establece un valor PrimaryKey
para el objeto DataTable
resultante. Debe definir PrimaryKey
para asegurarse de que las filas duplicadas se resuelven correctamente.
En el ejemplo de código siguiente se crea una instancia de SqlDataAdapter que utiliza un objeto SqlConnection a la base de datos Northwind
de Microsoft SQL Server y se rellena un objeto DataTable en un DataSet
con la lista de clientes. La instrucción SQL y los argumentos SqlConnection pasados al constructor SqlDataAdapter se utilizan para crear la propiedad SelectCommand del SqlDataAdapter.
Ejemplo
// Assumes that connection is a valid SqlConnection object.
string queryString =
"SELECT CustomerID, CompanyName FROM dbo.Customers";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
DataSet customers = new DataSet();
adapter.Fill(customers, "Customers");
Nota
El código que se muestra en este ejemplo no abre ni cierra explícitamente el objeto Connection
. El método Fill
abre de forma implícita el objeto Connection
que DataAdapter
utiliza cuando encuentra que la conexión no está abierta todavía. Si el método Fill
ha abierto la conexión, también la cierra cuando el método Fill
deja de utilizarla. Este hecho simplifica el código cuando se trabaja con una operación única, como Fill
o Update
. Sin embargo, en el caso de que se estén realizando varias operaciones que necesiten tener abierta una conexión, se puede mejorar el rendimiento de la aplicación llamando explícitamente al método Open
de Connection
, realizando las operaciones en el origen de datos y, finalmente, llamando al método Close
de Connection
. Es conveniente mantener abiertas las conexiones con el origen de datos el menor tiempo posible para liberar recursos, de manera que estén disponibles para otras aplicaciones cliente.
Varios conjuntos de resultados
Si DataAdapter
encuentra varios conjuntos de resultados, crea varias tablas en DataSet
. Las tablas reciben de forma predeterminada el nombre secuencial TableN, comenzando por "Table" que representa Table0. Si se pasa un nombre de tabla como argumento al método Fill
, las tablas reciben de forma predeterminada el nombre secuencial TableNameN, comenzando por "TableName" que representa TableName0.
Rellenado de un objeto DataSet a partir de varios objetos DataAdapter
Con una instancia de DataSet
se puede usar cualquier número de objetos DataAdapter
. Cada DataAdapter
se puede usar para rellenar uno o varios objetos DataTable
y resolver de nuevo las actualizaciones en el origen de datos correspondiente. Se pueden agregar objetosDataRelation
y Constraint
a DataSet
localmente, lo que permite relacionar datos procedentes de varios orígenes distintos. Por ejemplo, un DataSet
puede contener datos de una base de datos de Microsoft SQL Server, una base de datos de IBM Db2 expuesta mediante OLE DB y un origen de datos que genera secuencias XML. La comunicación con cada origen de datos se puede controlar usando uno o varios objetos DataAdapter
.
Ejemplo
En el ejemplo de código siguiente se rellena una lista de clientes a partir de la base de datos Northwind
almacenada en Microsoft SQL Server, y una lista de pedidos a partir de la base de datos Northwind
almacenada en Microsoft Access. Las tablas rellenas se relacionan entre sí mediante DataRelation
, con lo que se puede mostrar una lista de clientes con los pedidos que ha realizado cada uno.
// Assumes that customerConnection and orderConnection are valid SqlConnection objects.
SqlDataAdapter custAdapter = new SqlDataAdapter(
"SELECT * FROM dbo.Customers", customerConnection);
SqlDataAdapter ordAdapter = new SqlDataAdapter(
"SELECT * FROM Orders", orderConnection);
DataSet customerOrders = new DataSet();
custAdapter.Fill(customerOrders, "Customers");
ordAdapter.Fill(customerOrders, "Orders");
DataRelation relation = customerOrders.Relations.Add("CustOrders",
customerOrders.Tables["Customers"].Columns["CustomerID"],
customerOrders.Tables["Orders"].Columns["CustomerID"]);
foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)
{
Console.WriteLine(pRow["CustomerID"]);
foreach (DataRow cRow in pRow.GetChildRows(relation))
Console.WriteLine("\t" + cRow["OrderID"]);
}
Tipo decimal de SQL Server
De forma predeterminada, en DataSet
se almacenan datos mediante tipos de datos de .NET. En la mayor parte de las aplicaciones, estos tipos proporcionan una representación adecuada de la información del origen de datos. Sin embargo, esa representación puede ocasionar problemas cuando el tipo de datos del origen de datos es decimal o numérico de SQL Server. El tipo de datos decimal
de .NET permite un máximo de 28 dígitos significativos, mientras que el tipo de datos decimal
de SQL Server permite 38 dígitos. Si SqlDataAdapter
determina durante una operación Fill
que la precisión de un campo decimal
de SQL Server es superior a 28 caracteres, la fila actual no se agrega a DataTable
. En su lugar, se produce el evento FillError
que permite determinar si se va a producir o no una pérdida de precisión y tomar las medidas adecuadas. Para obtener más información sobre el evento FillError
, vea Control de eventos de objetos DataAdapter. Para obtener el valor decimal
de SQL Server, también se puede utilizar un objeto SqlDataReader y llamar al método GetSqlDecimal .
ADO.NET incluye compatibilidad mejorada con System.Data.SqlTypes en DataSet
. Para obtener más información, consulta SqlTypes and the DataSet.