Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

DataTable.Load méthode (IDataReader, LoadOption, FillErrorEventHandler)

 

Date de publication : novembre 2016

Remplit un DataTable avec des valeurs à partir d’une source de données à l’aide de l’élément IDataReader à l’aide d’un délégué de gestion des erreurs.

Espace de noms:   System.Data
Assembly:  System.Data (dans System.Data.dll)

public virtual void Load(
	IDataReader reader,
	LoadOption loadOption,
	FillErrorEventHandler errorHandler
)

Paramètres

reader
Type: System.Data.IDataReader

Un IDataReader qui fournit un jeu de résultats.

loadOption
Type: System.Data.LoadOption

Une valeur à partir de la LoadOption énumération qui indique comment lignes déjà présentes dans le DataTable sont associées aux lignes entrantes qui partagent la même clé primaire.

errorHandler
Type: System.Data.FillErrorEventHandler

Un FillErrorEventHandler délégué à appeler lorsqu’une erreur se produit lors du chargement des données.

Le Load méthode consomme le premier jeu de résultats de la charger IDataReader, et après l’achèvement réussi, définit la position du lecteur sur le jeu de résultats suivant, le cas échéant. Lors de la conversion de données, la Load méthode utilise les mêmes règles de conversion que la DbDataAdapter.Fill (méthode).

Le Load méthode doit prendre en considération trois problèmes spécifiques lors du chargement des données à partir d’un IDataReader instance : les opérations de schéma, les données et les événements. Lorsque vous travaillez avec le schéma de la Load méthode peut rencontrer les conditions décrites dans le tableau suivant. Les opérations de schéma effectue pour tous les jeux de résultats importés, même ceux ne contenant aucune donnée.

Condition

Comportement

Le DataTable ne possède aucun schéma.

Le Load méthode déduit le schéma basé sur les résultats de l’importation IDataReader.

Le DataTable possède un schéma, mais il n’est pas compatible avec le schéma chargé.

Le Load méthode lève une exception qui correspond à l’erreur particulière qui se produit lorsque vous tentez de charger des données dans le schéma incompatible.

Les schémas sont compatibles, mais le schéma du jeu de résultats chargé contient des colonnes qui n’existent pas dans le DataTable.

Le Load méthode ajoute les ou les colonnes supplémentaires à DataTabledu schéma. La méthode lève une exception si correspondant colonnes dans le DataTable et le jeu de résultats chargé ne sont pas des valeurs compatibles. La méthode récupère également les informations de contrainte de jeu de résultats pour toutes les colonnes ajoutées. Sauf dans le cas de contrainte de clé primaire, ces informations de contrainte sont utilisées uniquement si le courant DataTable ne contient pas de colonnes au début de l’opération de chargement.

Les schémas sont compatibles, mais le schéma du jeu de résultats chargé contient moins de colonnes que le DataTable.

Si une colonne manquante a une valeur par défaut définie ou type de données de la colonne est nullable, le Load méthode autorise les lignes à ajouter, en remplaçant la valeur par défaut ou la valeur null à la colonne manquante. Si aucune valeur par défaut ou la valeur null ne peut être utilisé, le Load méthode lève une exception. Si aucune valeur par défaut spécifique n’a été fournie, la Load méthode utilise la valeur null comme valeur par défaut implicite.

Avant de considérer que le comportement de la Load méthode en termes d’opérations de données, considérez que chaque ligne dans un DataTable conserve la valeur actuelle et la valeur d’origine pour chaque colonne. Ces valeurs peuvent être équivalentes ou peuvent être différentes si les données dans la ligne ont été modifiées depuis le remplissage du DataTable. Pour plus d'informations, voir États et versions de ligne.

Dans cet appel de méthode spécifié LoadOption paramètre influence le traitement des données entrantes. Comment la méthode Load doit gérer les lignes de chargement qui ont la même clé primaire que les lignes existantes ? Doit elle modifie les valeurs actuelles, les valeurs d’origine ou les deux ? Ces problèmes et bien plus encore, sont contrôlés par le loadOption paramètre.

Si la ligne existante et la ligne entrante contiennent des valeurs de clé primaire correspondantes, la ligne est traitée à l’aide de sa valeur d’état de ligne actuelle, sinon il est traité comme une nouvelle ligne.

En termes d’opérations d’événement, le RowChanging événement se produit avant la modification de chaque ligne et le RowChanged intervient après chaque ligne a été modifiée. Dans chaque cas, le Action propriété de la DataRowChangeEventArgs instance passée au gestionnaire d’événements contient des informations sur l’action particulière associée à l’événement. Valeur de cette action varie, selon l’état de la ligne avant l’opération de chargement. Dans chaque cas, les deux événements se produisent, et l’action est le même pour chacun. L’action peut être appliquée à la version actuelle ou d’origine de chaque ligne, ou les deux, selon l’état actuel de la ligne.

Le tableau suivant présente le comportement de la méthode Load lorsqu’elle est appelée avec chacune de la LoadOption de valeurs et montre également comment les valeurs interagissent avec l’état de ligne pour la ligne en cours de chargement. La dernière ligne (nommée « (absente) ») décrit le comportement pour les lignes entrantes qui ne correspondent à aucune ligne existante. Chaque cellule dans cette table décrit la valeur d’origine et actuelle pour un champ dans une ligne, ainsi que les DataRowState pour la valeur après la Load la méthode est terminée.

DataRowState existant

Upsert

OverwriteChanges

PreserveChanges (comportement par défaut)

Ajouté

En cours = < Entrée >

D’origine = - < non disponible >

État = < Ajouter >

RowAction = modification

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

En cours = < existant >

D’origine = < Entrée >

État = < modifié >

RowAction = ChangeOriginal

Modifié le

En cours = < Entrée >

D’origine = < existant >

État = < modifié >

RowAction = modification

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

En cours = < existant >

D’origine = < Entrée >

État = < modifié >

RowAction = ChangeOriginal

Supprimé

(Load n’affectent supprimé pas des lignes)

En cours =---

D’origine = < existant >

État = < Supprimer >

(Nouvelle ligne est ajoutée avec les caractéristiques suivantes)

En cours = < Entrée >

D’origine = < non disponible >

État = < Ajouter >

RowAction = ajouter

Annuler la suppression et

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

En cours = < non disponible >

D’origine = < Entrée >

État = < Supprimer >

RowAction = ChangeOriginal

Inchangé

En cours = < Entrée >

D’origine = < existant >

Si la nouvelle valeur est identique à la valeur existante puis

État = < inchangé >

RowAction = Nothing

Else

État = < modifié >

RowAction = modification

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

(Pas présent)

En cours = < Entrée >

D’origine = < non disponible >

État = < Ajouter >

RowAction = ajouter

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

En cours = < Entrée >

D’origine = < Entrée >

État = < inchangé >

RowAction = ChangeCurrentAndOriginal

Les valeurs dans un DataColumn peut être contraint à l’aide de propriétés telles que ReadOnly et AutoIncrement. Le Load méthode gère de telles colonnes de manière cohérente avec le comportement défini par les propriétés de la colonne. La contrainte en lecture seule sur un DataColumn s’applique uniquement aux modifications qui se produisent dans la mémoire. Le Load la méthode remplace les valeurs de colonne en lecture seule, si nécessaire.

Si vous spécifiez les options OverwriteChanges ou PreserveChanges lors de l’appel du Load méthode, puis l’hypothèse est effectuée que les données entrantes provient le DataTablede source de données principale et le DataTable effectue le suivi des modifications et peut propager les modifications à la source de données. Si vous sélectionnez l’option Upsert, il est supposé que les données proviennent d’une source de données secondaire, telles que les données fournies par un composant de couche intermédiaire, éventuellement altérée par un utilisateur. Dans ce cas, l’hypothèse est que l’intention est d’agréger des données à partir d’une ou plusieurs sources de données dans le DataTable, et puis éventuellement de propager les données dans la source de données principale. Le LoadOption paramètre est utilisé pour déterminer la version spécifique de la ligne qui doit être utilisé pour la comparaison de clé primaire. Le tableau ci-dessous fournit les détails.

Load (option)

Version de DataRow utilisée pour la comparaison de clé primaire

OverwriteChanges

Version d’origine, si elle existe, la version actuelle dans le cas contraire

PreserveChanges

Version d’origine, si elle existe, la version actuelle dans le cas contraire

Upsert

Version actuelle, si elle existe, la version originale dans le cas contraire

Le errorHandler paramètre est un FillErrorEventHandler délégué qui fait référence à une procédure qui est appelée lorsqu’une erreur se produit lors du chargement des données. Le FillErrorEventArgs paramètre transmis à la procédure fournit des propriétés qui vous permettent de récupérer des informations sur l’erreur qui s’est produite, la ligne actuelle de données, et les DataTable en cours de remplissage. À l’aide de ce mécanisme de délégué, au lieu d’un bloc try/catch plus simple, vous permet de déterminer l’erreur, gérer la situation et continuer le traitement si vous le souhaitez. Le FillErrorEventArgs paramètre fournit un Continue propriété : définissez cette propriété sur true pour indiquer que vous avez géré l’erreur et souhaitez continuer le traitement. Affectez à la propriété false pour indiquer que vous souhaitez interrompre le traitement. N’oubliez pas que la définition de la propriété false le code qui a déclenché le problème pour lever une exception.

static void Main()
{
    // Attempt to load data from a data reader in which
    // the schema is incompatible with the current schema.
    // If you use exception handling, you won't get the chance
    // to examine each row, and each individual table,
    // as the Load method progresses.
    // By taking advantage of the FillErrorEventHandler delegate,
    // you can interact with the Load process as an error occurs,
    // attempting to fix the problem, or simply continuing or quitting
    // the Load process:
    DataTable table = GetIntegerTable();
    DataTableReader reader = new DataTableReader(GetStringTable());
    table.Load(reader, LoadOption.OverwriteChanges, FillErrorHandler);

    Console.WriteLine("Press any key to continue.");
    Console.ReadKey();
}

private static DataTable GetIntegerTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(int));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { 4 });
    table.Rows.Add(new object[] { 5 });
    table.AcceptChanges();
    return table;
}

private static DataTable GetStringTable()
{
    // Create sample Customers table, in order
    // to demonstrate the behavior of the DataTableReader.
    DataTable table = new DataTable();

    // Create two columns, ID and Name.
    DataColumn idColumn = table.Columns.Add("ID", typeof(string));

    // Set the ID column as the primary key column.
    table.PrimaryKey = new DataColumn[] { idColumn };

    table.Rows.Add(new object[] { "Mary" });
    table.Rows.Add(new object[] { "Andy" });
    table.Rows.Add(new object[] { "Peter" });
    table.AcceptChanges();
    return table;
}

static void FillErrorHandler(object sender, FillErrorEventArgs e)
{
    // You can use the e.Errors value to determine exactly what
    // went wrong.
    if (e.Errors.GetType() == typeof(System.FormatException))
    {
        Console.WriteLine("Error when attempting to update the value: {0}", 
            e.Values[0]);
    }

    // Setting e.Continue to True tells the Load
    // method to continue trying. Setting it to False
    // indicates that an error has occurred, and the 
    // Load method raises the exception that got 
    // you here.
    e.Continue = true;
}

.NET Framework
Disponible depuis 2.0
Retour au début
Afficher: