Remplir des jeux de données à l’aide de TableAdapters dans les applications .NET Framework
Remarque
Les jeux de données et les classes associées sont des technologies .NET Framework héritées du début des années 2000 qui 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. Les technologies sont particulièrement utiles pour les applications qui permettent aux utilisateurs de modifier les données et de conserver les modifications apportées à la base de données. Bien que les jeux de données soient une technologie très réussie, nous recommandons que les nouvelles applications .NET utilisent Entity Framework Core. Entity Framework offre un moyen plus naturel d’utiliser des données tabulaires en tant que modèles objet et offre une interface de programmation plus simple.
Un composant TableAdapter remplit un jeu de données avec des données de la base de données, en fonction d’une ou plusieurs requêtes ou procédures stockées que vous spécifiez. TableAdapters peut également effectuer des ajouts, des mises à jour et des suppressions sur la base de données pour conserver les modifications que vous apportez au jeu de données. En outre, vous pouvez émettre des commandes globales qui ne sont pas liées à une table spécifique.
Note
Les concepteurs Visual Studio génèrent des TableAdapters. Si vous créez des jeux de données par programmation, utilisez la classe .NET DataAdapter
.
Pour plus d’informations sur les opérations TableAdapter, vous pouvez passer directement à l’un des articles suivants :
Article | Description |
---|---|
Créer et configurer TableAdapters | Découvrez comment utiliser les concepteurs pour créer et configurer TableAdapters. |
Créer des requêtes TableAdapter paramétrables | Découvrez comment permettre aux utilisateurs de fournir des arguments aux procédures ou requêtes TableAdapter. |
Accéder directement à la base de données avec un TableAdapter | Découvrez comment utiliser les méthodes DbDirect de TableAdapters. |
désactiver les contraintes lors du remplissage d’un jeu de données | Découvrez comment utiliser des contraintes de clé étrangère lors de la mise à jour des données. |
Étendre les fonctionnalités d'un TableAdapter | Découvrez comment ajouter du code personnalisé à TableAdapters. |
lire des données XML dans un jeu de données | Découvrez comment utiliser des données XML dans un jeu de données. |
Vue d’ensemble de TableAdapter
Les TableAdapters sont des composants générés par le concepteur qui se connectent à une base de données, exécutent des requêtes ou des procédures stockées et remplissent leur DataTable avec les données retournées. TableAdapters envoie également des données mises à jour de votre application à la base de données. Vous pouvez exécuter autant de requêtes que vous le souhaitez sur un TableAdapter tant qu’elle retourne des données conformes au schéma de sa table associée. Le diagramme suivant montre comment Les TableAdapters interagissent avec les bases de données et d’autres objets en mémoire :
Bien que TableAdapters soit conçu avec le Concepteur de jeux de données, les classes TableAdapter
ne sont pas générées en tant que classes imbriquées de DataSet. Au lieu de cela, ils se trouvent dans des espaces de noms distincts spécifiques à chaque jeu de données. Par exemple, si vous avez un jeu de données nommé NorthwindDataSet
, les TableAdapters associés à des objets DataTable dans le NorthwindDataSet
se trouvent dans l’espace de noms NorthwindDataSetTableAdapters
. Pour accéder à un TableAdapter particulier par programmation, déclarez une nouvelle instance de la classe TableAdapter
. Par exemple:
NorthwindDataSet northwindDataSet = new NorthwindDataSet();
NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter =
new NorthwindDataSetTableAdapters.CustomersTableAdapter();
customersTableAdapter.Fill(northwindDataSet.Customers);
Schéma DataTable associé
Lorsque vous créez un TableAdapter, vous utilisez la requête ou la procédure stockée initiale pour définir le schéma du TableAdapter associé à DataTable. Vous exécutez cette requête initiale ou procédure stockée en appelant la méthode Fill
du TableAdapter, qui remplit le DataTableassocié du TableAdapter. Toutes les modifications apportées à la requête principale de TableAdapter sont reflétées dans le schéma de la table de données associée. Par exemple, si vous supprimez une colonne de la requête principale, le Concepteur de jeux de données supprime également la colonne de la table de données associée. Si des requêtes supplémentaires sur TableAdapter utilisent des instructions SQL qui retournent des colonnes qui ne figurent pas dans la requête principale, le Concepteur de jeux de données tente de synchroniser les modifications de colonne entre la requête principale et les requêtes supplémentaires.
Commandes de mise à jour du TableAdapter
La fonctionnalité de mise à jour d’un TableAdapter dépend de la quantité d’informations disponibles dans la requête principale de l’Assistant TableAdapter. Par exemple, Les TableAdapters configurés pour extraire des valeurs de plusieurs tables (à l’aide d’un JOIN
), des valeurs scalaires, des vues ou les résultats des fonctions d’agrégation ne sont pas initialement créés avec la possibilité d’envoyer des mises à jour à la base de données sous-jacente. Toutefois, vous pouvez configurer les propriétés InsertCommand, UpdateCommandet DeleteCommand manuellement dans la fenêtre propriétés .
Requêtes TableAdapter
TableAdapters peut contenir plusieurs requêtes pour remplir leurs tables de données associées. Vous pouvez définir autant de requêtes pour un TableAdapter que votre application nécessite, tant que chaque requête retourne des données conformes au même schéma que sa table de données associée. Cette fonctionnalité permet à un TableAdapter de charger différents résultats en fonction de critères différents.
Par exemple, si votre application contient une table avec des noms de clients, vous pouvez créer une requête qui remplit la table avec chaque nom de client commençant par une certaine lettre. Vous pouvez créer une autre requête qui remplit la table avec tous les clients situés dans le même état. Pour remplir une table Customers
avec des clients dans un état donné, créez une requête FillByState
qui prend un paramètre pour la valeur d’état comme suit : SELECT * FROM Customers WHERE State = @State
. Exécutez la requête en appelant la méthode FillByState
et en passant la valeur du paramètre, par exemple : CustomerTableAdapter.FillByState("WA")
.
Outre l’ajout de requêtes qui retournent des données du même schéma que la table de données de TableAdapter, vous pouvez ajouter des requêtes qui retournent des valeurs scalaires (uniques). Par exemple, une requête qui retourne un nombre de clients (SELECT Count(*) From Customers
) est valide pour un CustomersTableAdapter
, même si les données retournées ne sont pas conformes au schéma de la table.
Propriété ClearBeforeFill
Par défaut, chaque fois que vous exécutez une requête pour remplir la table de données d’un TableAdapter, les données existantes sont effacées et seuls les résultats de la requête sont chargés dans la table. Si vous souhaitez ajouter ou fusionner les données qu’une requête retourne aux données existantes dans une table de données, définissez la propriété ClearBeforeFill
de TableAdapter sur false
. Que vous effaciez ou non les données, vous devez explicitement renvoyer les mises à jour à la base de données si vous voulez les enregistrer. Par conséquent, veillez à enregistrer les modifications apportées aux données de la table avant d’exécuter une autre requête qui remplit la table. Pour plus d’informations, consultez Mettre à jour les données en utilisant un TableAdapter.
Héritage de TableAdapter
TableAdapters étend les fonctionnalités des adaptateurs de données standard en encapsulant une classe de DataAdapter configurée. Par défaut, TableAdapter hérite de la classe Component et ne peut pas être converti en classe DataAdapter. La conversion d’un TableAdapter vers la classe DataAdapter génère une erreur InvalidCastException. Pour modifier la classe de base d’un TableAdapter, spécifiez une classe qui dérive de la classe Component dans la propriété classe de base de TableAdapter dans le Concepteur de jeux de données.
Méthodes et propriétés TableAdapter
La classe TableAdapter
n’est pas un type .NET, ce qui signifie que vous ne pouvez pas la rechercher dans l’Explorateur d’objets ou la documentation de référence. Visual Studio le crée au moment du design lorsque vous utilisez l’un des Assistants décrits précédemment. Le nom que Visual Studio attribue à un TableAdapter que vous créez est basé sur le nom de la table avec laquelle vous travaillez. Par exemple, lorsque vous créez un TableAdapter basé sur une table d’une base de données nommée Orders
, tableAdapter est nommé OrdersTableAdapter
. Pour modifier le nom de classe de TableAdapter, utilisez la propriété Name dans la fenêtre Propriétés du Concepteur de jeux de données.
Les méthodes et propriétés couramment utilisées d’un TableAdapter sont les suivantes :
Membre | Description |
---|---|
TableAdapter.Fill |
Remplit la table de données associée de TableAdapter avec les résultats de la commande SELECT de TableAdapter. |
TableAdapter.Update |
Renvoie les modifications apportées à la base de données et retourne un entier qui représente le nombre de lignes affectées par la mise à jour. Pour plus d’informations, consultez Mettre à jour les données à l’aide d’un TableAdapter. |
TableAdapter.GetData |
Retourne une nouvelle DataTable remplie de données. |
TableAdapter.Insert |
Crée une ligne dans la table de données. Pour plus d’informations, consultez Insérer de nouveaux enregistrements dans une base de données. |
TableAdapter.ClearBeforeFill |
Détermine si une table de données est vidée avant d’appeler l’une des méthodes Fill . |
Méthode de mise à jour TableAdapter
Les TableAdapters utilisent des commandes de données pour lire et écrire à partir de la base de données. Utilisez la requête Fill
initiale de TableAdapter (principale) comme base pour créer le schéma de la table de données associée et les InsertCommand
, UpdateCommand
et DeleteCommand
commandes associées à la méthode TableAdapter.Update
. Lorsque vous appelez la méthode Update
d'un TableAdapter, elle exécute les instructions qui ont été créées lorsque le TableAdapter a été configuré initialement, et non l'une des requêtes supplémentaires que vous avez ajoutées avec l'Assistant Configuration de requête du TableAdapter .
Lorsque vous utilisez un TableAdapter, il effectue efficacement les mêmes opérations avec les commandes que vous effectuez généralement. Par exemple, lorsque vous appelez la méthode Fill
de l’adaptateur, l’adaptateur exécute la commande de données dans sa propriété SelectCommand
et utilise un lecteur de données (par exemple, SqlDataReader) pour charger le jeu de résultats dans la table de données. De même, lorsque vous appelez la méthode Update
de l’adaptateur, elle exécute la commande appropriée (dans l'UpdateCommand
, InsertCommand
et les propriétés DeleteCommand
) pour chaque enregistrement modifié dans la table de données.
Note
Si la requête principale contient suffisamment d’informations, le concepteur crée l'InsertCommand
, UpdateCommand
et les commandes DeleteCommand
par défaut lorsque le concepteur génère tableAdapter. Toutefois, si la requête principale de TableAdapter est supérieure à une seule instruction de table SELECT
, le concepteur peut ne pas être en mesure de générer ces commandes. Dans ce cas, vous pouvez recevoir une erreur lorsque vous exécutez la méthode TableAdapter.Update
.
TableAdapter GenerateDbDirectMethods
Outre InsertCommand
, UpdateCommand
et DeleteCommand
, TableAdapters sont créés avec les méthodes suivantes que vous pouvez exécuter directement sur la base de données : TableAdapter.Insert
, TableAdapter.Update
et TableAdapter.Delete
. Vous pouvez appeler ces méthodes directement pour manipuler des données dans la base de données. Cela signifie que vous pouvez appeler ces méthodes individuelles à partir de votre code au lieu d’appeler TableAdapter.Update
pour gérer les insertions, mises à jour et suppressions en attente pour la table de données associée.
Si vous ne souhaitez pas créer ces méthodes directes, définissez la propriété GenerateDbDirectMethods du TableAdapter sur False dans la fenêtre Propriétés. Les requêtes supplémentaires ajoutées à TableAdapter sont des requêtes autonomes, qui ne génèrent pas ces méthodes.
Prise en charge de TableAdapter pour les types pouvant accepter la valeur Null
TableAdapters prend en charge les types nullables Nullable<T>
et T?
. Pour plus d’informations sur les types de valeurs nullables dans Visual Basic, consultez types de valeurs nullables (Visual Basic). Pour plus d’informations sur les types de valeur nullable en C#, consultez types de valeur nullable (C#).
Référence TableAdapterManager
Par défaut, Visual Studio génère une classe TableAdapterManager
lorsque vous créez un jeu de données qui contient des tables associées. Pour empêcher la génération de la classe, remplacez la valeur de la propriété Hierarchical Update
du jeu de données par false
. Lorsque vous faites glisser une table qui a une relation sur l’aire de conception d’une page Windows Form ou WPF, Visual Studio déclare une variable membre de la classe. Si vous n’utilisez pas la liaison de données, vous devez déclarer manuellement la variable.
Étant donné que la classe TableAdapterManager
n’est pas un type .NET, elle n’apparaît pas dans la documentation de référence. Visual Studio le crée au moment du design dans le cadre du processus de création de jeu de données.
Le tableau suivant répertorie les méthodes et propriétés fréquemment utilisées de la classe TableAdapterManager
:
Membre | Description |
---|---|
méthode UpdateAll |
Enregistre toutes les données de toutes les tables de données. |
Propriété BackUpDataSetBeforeUpdate |
Détermine s’il faut créer une copie de sauvegarde du jeu de données avant d’exécuter la TableAdapterManager.UpdateAll method.Boolean . |
Propriété tableNameTableAdapter |
Représente un TableAdapter. Le TableAdapterManager généré contient une propriété pour chaque TableAdapter qu’il gère. Par exemple, un ensemble de données avec les tables Customers et Orders est généré avec un TableAdapterManager qui contient les propriétés CustomersTableAdapter et OrdersTableAdapter . |
Propriété UpdateOrder |
Contrôle l’ordre des commandes d’insertion, de mise à jour et de suppression individuelles. Définissez cette propriété sur l’une des valeurs de l’énumération TableAdapterManager.UpdateOrderOption .Par défaut, le UpdateOrder est défini sur InsertUpdateDelete , ce qui signifie que les insertions, les mises à jour, puis les suppressions sont effectuées pour toutes les tables du jeu de données. |
Sécurité
Lorsque vous utilisez des commandes de données avec une propriété CommandType
définie sur Text, vérifiez soigneusement les informations envoyées à partir d’un client avant de les transmettre à votre base de données. Les utilisateurs malveillants peuvent essayer d’envoyer (injecter) des instructions SQL modifiées ou supplémentaires pour obtenir un accès non autorisé à la base de données. Avant de transférer l’entrée utilisateur vers une base de données, vérifiez toujours que les informations sont valides. Une bonne pratique consiste à utiliser des requêtes paramétrables ou des procédures stockées lorsque cela est possible.