Interroger des jeux de données dans des applications .NET Framework

Remarque

Les jeux de données et les classes associées sont des technologies .NET Framework héritées qui datent du début des années 2000. Elles permettent aux applications d’utiliser des données en mémoire pendant que les applications sont déconnectées de la base de données. Elles sont particulièrement utiles aux applications qui permettent aux utilisateurs de modifier des données, et de rendre ces changements persistants dans la base de données. Même si les jeux de données sont une technologie très efficace, nous vous recommandons d’utiliser Entity Framework Core pour les nouvelles applications .NET. Entity Framework offre un moyen plus naturel d’utiliser des données tabulaires en tant que modèles objet. De plus, il présente une interface de programmation plus simple.

Pour rechercher des enregistrements spécifiques dans un jeu de données, utilisez la méthode FindBy sur DataTable, écrivez votre propre instruction foreach pour effectuer une boucle sur la collection Lignes de la table ou utilisez LINQ to DataSet.

Respect de la casse du jeu de données

Dans un jeu de données, les noms de table et de colonnes ne respectent pas la casse par défaut, c'est-à-dire qu'une table dans un jeu de données appelée « Clients » peut également être appelée « clients ». Cela correspond aux conventions d'affectation de noms dans de nombreuses bases de données, notamment SQL Server. Dans SQL Server, le comportement par défaut repose sur le fait que les noms des éléments de données ne peuvent pas être distingués uniquement par cas.

Notes

Contrairement aux jeux de données, les documents XML respectent la casse, de sorte que les noms des éléments de données définis dans les schémas respectent la casse. Par exemple, le protocole de schéma permet au schéma de définir une table appelée Customers et une autre table appelée customers. Cela peut entraîner des collisions de noms lorsqu'un schéma qui contient des éléments qui diffèrent que par la casse est utilisé pour générer une classe de jeu de données.

Toutefois, la sensibilité de la casse peut être un facteur dans la façon dont les données sont interprétées dans le jeu de données. Par exemple, si vous filtrez des données dans une table de jeux de données, les critères de recherche peuvent retourner des résultats différents selon que la comparaison respecte la casse. Vous pouvez contrôler la sensibilité de la casse du filtrage, de la recherche et du tri en définissant la propriété du jeu de données CaseSensitive. Toutes les tables du jeu de données héritent par défaut de la valeur de cette propriété. (Vous pouvez remplacer cette propriété pour chaque table individuelle en définissant la propriété CaseSensitive de la table.)

Rechercher une ligne spécifique dans une table de données

Rechercher une ligne dans un jeu de données typé avec une valeur de clé primaire

  • Pour localiser une ligne, appelez la méthode fortement typée FindBy qui utilise la clé primaire de la table.

    Dans l’exemple suivant, la colonne CustomerID est la clé primaire de la table Customers. Cela signifie que la méthode générée FindBy est FindByCustomerID. L’exemple montre comment affecter une variable spécifique DataRow à l’aide de la méthode générée FindBy.

    NorthwindDataSet.CustomersRow customersRow = 
        northwindDataSet1.Customers.FindByCustomerID("ALFKI");
    

Pour rechercher une ligne dans un jeu de données non typé avec une valeur de clé primaire

  • Appelez la méthode Find d’une collection DataRowCollection, en passant la clé primaire en tant que paramètre.

    L’exemple suivant montre comment déclarer une nouvelle ligne appelée foundRow et l’affecter à la valeur de retour de la méthode Find. Si la clé primaire est trouvée, le contenu de l’index de colonne 1 s’affiche dans une boîte de message.

    string s = "primaryKeyValue";
    DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s);
    
    if (foundRow != null) 
    {
        MessageBox.Show(foundRow[0].ToString());
    }
    else
    {
        MessageBox.Show("A row with the primary key of " + s + " could not be found");
    }
    

Rechercher des lignes par valeurs de colonne

Rechercher des lignes en fonction des valeurs de n’importe quelle colonne

  • Les tables de données sont créées avec la méthode Select, qui retourne un tableau de DataRow en fonction de l’expression passée à la méthode Select. Pour plus d’informations sur la création d’expressions valides, consultez la section « Syntaxe d’expression » de la page sur la propriété Expression.

    L’exemple suivant montre comment utiliser la méthode Select de la méthode DataTable pour localiser des lignes spécifiques.

    DataRow[] foundRows;
    foundRows = dataSet1.Tables["Customers"].Select("CompanyName Like 'A%'");
    

Lorsque les tables d’un jeu de données sont associées, un objet DataRelation peut rendre les enregistrements associés disponibles dans une autre table. Par exemple, un jeu de données contenant Customers et des tables Orders peuvent être mis à disposition.

Vous pouvez utiliser un objet DataRelation pour localiser les enregistrements associés en appelant la méthode GetChildRows d’une table parente DataRow. Cette méthode retourne un tableau d’enregistrements enfants associés. Vous pouvez également appeler la méthode GetParentRow d’une table enfant DataRow. Cette méthode retourne une valeur unique DataRow à partir de la table parente.

Cette page fournit des exemples utilisant des jeux de données typés. Pour plus d’informations sur la navigation dans les relations dans des jeux de données non typés, consultez Navigation dans DataRelations.

Notes

Si vous travaillez dans une application Windows Forms et que vous utilisez les fonctionnalités de liaison de données pour afficher des données, le formulaire généré par le concepteur peut fournir suffisamment de fonctionnalités pour votre application. Pour plus d’informations, consultez Lier des contrôles aux données dans Visual Studio. Plus précisément, consultez Relations dans les jeux de données.

Les exemples de code suivants montrent comment naviguer vers le haut et vers le bas dans les jeux de données typés. Les exemples de code utilisent les DataRow (NorthwindDataSet.OrdersRow) typés et les méthodes FindBy PrimaryKey (FindByCustomerID) générées pour localiser une ligne souhaitée et retourner les enregistrements associés. Les exemples compilent et s’exécutent correctement uniquement si vous avez :

  • Une instance d’un jeu de données nommé NorthwindDataSet avec une table Customers.

  • Une table Orders.

  • Une relation nommée FK_Orders_Customers relative aux deux tables.

En outre, les deux tables doivent être remplies de données pour que tous les enregistrements soient retournés.

Pour retourner les enregistrements enfants d’un enregistrement parent sélectionné

  • Appelez la méthode GetChildRows d’une ligne de données spécifique Customers et retournez un tableau de lignes à partir de la table Orders :

    string custID = "ALFKI";
    NorthwindDataSet.OrdersRow[] orders;
    
    orders = (NorthwindDataSet.OrdersRow[])northwindDataSet.Customers.
        FindByCustomerID(custID).GetChildRows("FK_Orders_Customers");
    
    MessageBox.Show(orders.Length.ToString());
    

Retourner l’enregistrement parent d’un enregistrement enfant sélectionné

  • Appelez la méthode GetParentRow d’une ligne de données spécifique Orders et retournez une seule ligne à partir de la table Customers :

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);