Share via


Adición de las restricciones existentes a un conjunto de datos

Se aplica a: .NET Framework .NET .NET Standard

Descargar ADO.NET

El método Fill de SqlDataAdapter rellena un objeto DataSet solo con las columnas y filas de un origen de datos. Aunque el origen de datos suele establecer restricciones, el método Fill no agrega de forma predeterminada esta información del esquema al objeto DataSet.

Para llenar un objeto DataSet con la información de restricciones de clave principal existentes de un origen de datos, puede llamar al método FillSchema de DataAdapter, o bien establecer la propiedad MissingSchemaAction de DataAdapter en AddWithKey antes de llamar a Fill. De esta forma se garantiza que las restricciones de clave principal del objeto DataSet reflejen las del origen de datos.

Nota

La información de restricciones de clave externa no se incluye y se debe crear de forma explícita.

Al agregar la información del esquema a un objeto DataSet antes de rellenarlo con datos, se garantiza que se incluyan las restricciones de clave principal con los objetos DataTable de DataSet. Como resultado, al realizar llamadas adicionales para rellenar el objeto DataSet, la información de la columna de clave principal se usa para hacer coincidir las nuevas filas del origen de datos con las filas actuales de cada instancia de DataTable, y los datos actuales de las tablas se sobrescriben con los del origen de datos. Sin la información del esquema, las filas nuevas del origen de datos se agregan al objeto DataSet, lo que genera filas duplicadas.

Nota

Si una columna del origen de datos es de incremento automático, el método FillSchema, o bien el método Fill con el valor AddWithKey en la propiedad MissingSchemaAction, crea un objeto DataColumn con una propiedad AutoIncrement establecida en true. Pero en este caso tendrá que definir manualmente los valores AutoIncrementStep y AutoIncrementSeed.

Nota

Al usar FillSchema o establecer MissingSchemaAction en AddWithKey, se necesita procesamiento adicional en el origen de datos para determinar la información de la columna de clave principal. Este proceso adicional puede reducir el rendimiento. Si conoce en la fase de diseño la información de la clave principal, es aconsejable especificar de modo explícito la columna o columnas que la forman para mejorar el rendimiento.

En el ejemplo de código siguiente se muestra cómo agregar la información del esquema a un objeto DataSet mediante FillSchema:

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

En el ejemplo de código siguiente se muestra cómo agregar la información del esquema a un objeto DataSet mediante la propiedad MissingSchemaAction y el método Fill:

// 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"]);
}

Control de varios conjuntos de resultados

Si el objeto DataAdapter detecta varios conjuntos de resultados devueltos por SelectCommand, creará varias tablas en el objeto DataSet. Las tablas reciben de forma predeterminada un nombre incremental de base cero TableN, comenzando por Table en lugar de “Table0”. Las tablas reciben el nombre incremental en base cero TableNameN, comenzando por TableName en lugar de “TableName0”, si se pasa un nombre de tabla como un argumento al método FillSchema.

Consulte también