Partager via


Ajout de contraintes existantes à un DataSet

S'applique à : .NET Framework .NET .NET Standard

Télécharger ADO.NET

La méthode Filldu SqlDataAdapter remplit un objet DataSet seulement avec les colonnes et les lignes de la table d’une source de données ; bien que les contraintes soient généralement définies par la source de données, la méthode Fill n’ajoute pas ces informations de schéma au DataSet par défaut.

Pour remplir un DataSet avec les informations de contrainte de clé primaire existantes provenant d’une source de données, vous pouvez appeler la méthode FillSchema du DataAdapter ou définir MissingSchemaAction du DataAdapter sur AddWithKey avant d’appeler Fill. Ceci va garantir que les contraintes de clé primaire dans le DataSet reflètent celles de la source de données.

Notes

Les informations de contrainte de clé étrangère ne sont pas incluses et doivent être créées explicitement.

L’ajout d’informations de schéma à un DataSet avant de le remplir avec les données garantit que les contraintes de clé primaire sont incluses avec les objets DataTable du DataSet. En conséquence, quand des appels supplémentaires sont effectués pour remplir le DataSet, les informations de colonne de clé primaire sont utilisées pour faire correspondre les nouvelles lignes de la source de données avec les lignes actuelles de chaque DataTable ; les données actuelles des tables sont remplacées par celles de la source de données. Sans les informations de schéma, les nouvelles lignes de la source de données sont ajoutées au DataSet, ce qui a pour résultat des lignes en doublon.

Notes

Si une colonne d’une source de données est identifiée comme étant auto-incrémentée, la méthode FillSchema ou la méthode Fill avec une MissingSchemaAction d’AddWithKey crée une DataColumn avec une propriété AutoIncrement définie sur true. Il vous faudra cependant définir vous-même les valeurs AutoIncrementStep et AutoIncrementSeed.

Notes

L’utilisation de FillSchema ou la définition de MissingSchemaAction sur AddWithKey nécessite un traitement supplémentaire au niveau de la source de données pour déterminer les informations des colonnes de clé primaire. Ce traitement supplémentaire peut gêner la performance. Si vous connaissez les informations de clé primaire au moment du design, il est recommandé de spécifier explicitement la ou les colonnes de clé primaire afin d'atteindre une performance optimale.

L’exemple de code suivant montre comment ajouter des informations de schéma à un DataSet en utilisant 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");

L’exemple de code suivant montre comment ajouter des informations de schéma à un DataSet en utilisant la propriété MissingSchemaAction et la méthode 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"]);
}

Gestion de plusieurs jeux de résultats

Si le DataAdapter trouve plusieurs jeux de résultats retournés depuis la SelectCommand, il va créer plusieurs tables dans le DataSet. Les tables recevront un nom incrémentiel par défaut commençant à zéro Table N, en commençant par Table au lieu de « Table0 ». Les tables recevront un nom incrémentiel commençant à zéro TableName N en commençant par TableName au lieu de « TableName0 » si un nom de table est passé comme argument à la méthode FillSchema.

Voir aussi