Page d'Accueil

Sauvegarder les enregistrements d'un Tableau

 

Introduction

Quand l'application est fermée, malheureusement, toute information créée quand l'application fonctionne est perdu. Tant que le premier but d'une application est de créer une ou plusieurs listes utilisées pour organiser l'information, probablement l'essence d'une application est de préserver l'information créée telle que, en utilisant l'application, l'information ou la donnée basée sur cette application puisse être recouvrée la prochaine fois que l'application fonctionne, sans la recréer.

Naturellement, il y a diverses manières de sauvegarder l'information créée dans une application. comme la classe DataSet est équipée de tous les dispositifs nécessaires utilisés pour créer et contrôler une ou plusieurs listes d'une application, elle fournit également, à un niveau très élevé, la sauvegarde de l'information stockée dans ses listes.

 

Sauvegarder un Ensemble de données

Une fois qu'un nouvel enregistrement a été créé ou quand les listes d'un ensemble de données ont été fournies en information, vous pouvez sauvegarder les changements et les stocker dans un fichier électronique. Par défaut, la classe DataSet est équipée pour sauvegarder ses listes comme XML. Pour soutenir ceci, elle est équipée de la méthode WriteXml () qui est prise en charge dans diverses versions. Une des versions de cette méthode utilise la syntaxe suivante :

public void WriteXml(string fileName);

Cette méthode prend comme argument le nom du nouveau fichier ou de son chemin. En fournissant cet argument, assurez vous d'ajouter l'extension .xml au nom de fichier. Cette méthode fait deux choses : elle vérifie l'existence du fichier et elle le sauvegarde. Si le fichier que vous avez fourni n'est pas trouvé dans le chemin, cette méthode le crée et écrit les enregistrements dedans. Si le fichier existe déjà, cette méthode l'ouvre, trouve sa fin, et appose les nouvelles données à la fin. Ceci rend la méthode très utile et conviviale.

Voici un exemple de sauvegarde d' un ensemble de données utilisant cette méthode:

using System;
using System.IO;
using System.Data;

namespace VideoCollection
{
    public static  class Program
    {
        static DataSet dsVideos;

        static DataColumn colShelfNumber;
        static DataColumn colTitle;
        static DataColumn colDirector;
        static DataColumn colLength;
        static DataColumn colYear;
        static DataColumn colRating;
        static DataTable tblVideos;

        static string strDirectory;

        static void CreateCollection()
        {
            dsVideos = new DataSet("Videos");

            tblVideos = new DataTable("Video");

            colShelfNumber = new DataColumn("ShelfNumber",
                Type.GetType("System.String"));
            tblVideos.Columns.Add(colShelfNumber);

            colTitle = new DataColumn("Title",
                Type.GetType("System.String"));
            tblVideos.Columns.Add(colTitle);

            colDirector = new DataColumn("Director",
                                         Type.GetType("System.String"));
            tblVideos.Columns.Add(colDirector);

            colLength = new DataColumn("Length",
                                       Type.GetType("System.String"));
            tblVideos.Columns.Add(colLength);

            colYear = new DataColumn("Year",
                                       Type.GetType("System.Int16"));
            tblVideos.Columns.Add(colYear);

            colRating = new DataColumn("Rating",
                                       Type.GetType("System.String"));
            tblVideos.Columns.Add(colRating);

            dsVideos.Tables.Add(tblVideos);

            strDirectory = @"C:\Video Collection";
            Directory.CreateDirectory(strDirectory);
            dsVideos.WriteXml(strDirectory + @"\videos.xml");
        }

        static void CreateRecord()
        {
            DataRow rowVideo = tblVideos.NewRow();

            rowVideo[0] = "GT-682";
            rowVideo[1] = "A Few Good Men";
            rowVideo[2] = "Rob Reiner";
            rowVideo[3] = "138 Minutes";
            rowVideo[4] = 1992;
            rowVideo[5] = "R";

            tblVideos.Rows.Add(rowVideo);
            dsVideos.WriteXml(strDirectory + @"\videos.xml");
        }

        static int Main(string[] args)
        {
            CreateCollection();
            CreateRecord();

            return 0;
        }
    }
}

Si vous voulez contrôler comment le fichier devrait être créé à partir de zéro, au lieu de passer le nom du fichier à cette méthode, créer d'abord un stream en utilisant une classe Stream dérivée telle que FileStream. Ceci laisse indiquer les options nécessaires en utilisant les propriétés FileMode, FileAccess, et FileShare. Une fois que le stream est prêt, le passer à la méthode WriteXml () parce qu'elle est également prise en charge dans la syntaxe suivante :

public void WriteXml(Stream stream);

Voici un exemple:

using System;
using System.IO;
using System.Data;

namespace VideoCollection
{
    public static  class Program
    {
        . . . No Change

        static void CreateRecord()
        {
            FileStream fsVideos = new FileStream(strDirectory + @"\videos.xml",
                                                 FileMode.Create,
                                                 FileAccess.Write);
            object[] rowVideo = { "MM-258", "Fatal Attraction", "Adrian Lyne",
                                  "120 Minutes", 1987, "R" };

            tblVideos.Rows.Add(rowVideo);
            dsVideos.WriteXml(fsVideos);

            fsVideos.Close();
        }

        static int Main(string[] args)
        {
            CreateCollection();
            CreateRecord();

            return 0;
        }
    }
}

Si vous voulez que le fichier soit formaté comme texte, vous pouvez utiliser la version suivante de la méthode :

public void WriteXml(TextWriter writer);

Si vous préférez utiliser une variable XmlWriter pour contrôler le fichier, utilisez la version suivante de la méthode :

public void WriteXml(XmlWriter writer);

Evidemment pour utiliser cette méthode, vous devez d'abord définir un type de variable XmlWriter.

Practical Learning Étude Pratique : Créer un Ensemble de données

  1. Pour créer une nouvelle classe, sur le menu principal, cliquez projet - > Ajouter la classe…
  2. Placez le nom Inventory et cliquez Ajouter
  3. Changez le fichier comme suit:
     
    using System;
    using System.IO;
    using System.Xml;
    using System.Data;
    
    namespace CollegeParkAutoParts4
    {
        public class Inventory
        {
            private DataColumn colPartNumber;
            private DataColumn colYear;
            private DataColumn colMake;
            private DataColumn colModel;
            private DataColumn colPartName;
            private DataColumn colPartPrice;
    
            private DataColumn colItemNumber;
            private DataColumn colItemName;
            private DataColumn colItemPrice;
    
            private DataTable tblAutoParts;
            private DataTable tblStoreItems;
            private DataSet dsStoreItems;
    
            string strDirectory;
            string strFilename;
    
            public Inventory()
            {
                colPartNumber = new DataColumn("PartNumber",
    				 Type.GetType("System.Int32"));
                colYear = new DataColumn("Year",
    				 Type.GetType("System.Int32"));
                colMake = new DataColumn("Make",
    				 Type.GetType("System.String"));
                colModel = new DataColumn("Model",
    				 Type.GetType("System.String"));
                colPartName = new DataColumn("PartName",
    				 Type.GetType("System.String"));
                colPartPrice = new DataColumn("PartPrice",
    				 Type.GetType("System.Double"));
    
                tblAutoParts = new DataTable("AutoPart");
                tblAutoParts.Columns.Add(colPartNumber);
                tblAutoParts.Columns.Add(colYear);
                tblAutoParts.Columns.Add(colMake);
                tblAutoParts.Columns.Add(colModel);
                tblAutoParts.Columns.Add(colPartName);
                tblAutoParts.Columns.Add(colPartPrice);
    
                tblStoreItems = new DataTable("StoreItem");
                colItemNumber = new DataColumn("ItemNumber",
    				 Type.GetType("System.Int32"));
                colItemName = new DataColumn("ItemName",
    				 Type.GetType("System.String"));
                colItemPrice = new DataColumn("ItemPrice",
    				 Type.GetType("System.Double"));
                tblStoreItems .Columns.Add(colItemNumber);
                tblStoreItems.Columns.Add(colItemName);
                tblStoreItems.Columns.Add(colItemPrice);
    
                dsStoreItems = new DataSet("StoreItems");
                dsStoreItems.Tables.Add(tblAutoParts);
                dsStoreItems.Tables.Add(tblStoreItems);
    
                strDirectory = @"C:\College Park Auto Parts";
                strFilename = strDirectory + "\\" + "StoreItems.xml";
                DirectoryInfo dirInfo = new DirectoryInfo(strDirectory);
    
                if (!dirInfo.Exists)
                    dirInfo.Create();
            }
    
            public void CreateStoreItem()
            {
                int year = 1960;
                int iPartNumber = 0, iItemNumber = 0;
                double unitPrice = 0.00D;
                string strMake = "Unknown", strModel = "Unknown",
                       strPartName = "N/A", strItemName = "N/A";
                int typeOfItem = 0;
                char ansAdd = 'n';
    
                if (File.Exists(strFilename))
                    dsStoreItems.ReadXml(strFilename);
    
                do
                {
                    try
                    {
                  Console.WriteLine("What type of item do you want to add");
                  Console.WriteLine("1. An auto part (for a car or an engine)");
                        Console.WriteLine("2. Another type of item, " +
    				      "not for a specific car");
                        Console.WriteLine("0. Stop");
                  Console.WriteLine("Enter the following pieces of information");
                        Console.Write("Your Choice: ");
                        typeOfItem = int.Parse(Console.ReadLine());
    
                        if (typeOfItem == 1)
                        {
                            Random rndPartNumber = new Random();
                            iPartNumber = rndPartNumber.Next(100000, 999999);
    
                            try
                            {
                                Console.Write("Car Year:          ");
                                year = int.Parse(Console.ReadLine());
                            }
                            catch (FormatException)
                            {
                                Console.WriteLine("Invalid year");
                            }
                            Console.Write("Make (or None if N/A):  ");
                            strMake = Console.ReadLine();
                            Console.Write("Model (or None if N/A): ");
                            strModel = Console.ReadLine();
                            Console.Write("Part Name:              ");
                            strPartName = Console.ReadLine();
    
                            try
                            {
                                Console.Write("Unit Price:             ");
                                unitPrice = double.Parse(Console.ReadLine());
                            }
                            catch (FormatException)
                            {
                                Console.WriteLine("Invalid unit price");
                            }
    
                            Console.WriteLine("\nHere is a summary of " +
    					  "the part to be added");
                        Console.WriteLine("--------------------------------");
                            Console.WriteLine("Part Number: {0}", iPartNumber);
                            Console.WriteLine("Year:        {0}", year);
                            Console.WriteLine("Make:        {0}", strMake);
                            Console.WriteLine("Model:       {0}", strModel);
                            Console.WriteLine("Part Name:   {0}", strPartName);
                            Console.WriteLine("Unit Price:  {0:C}", unitPrice);
                        Console.WriteLine("--------------------------------");
    
                            Console.Write("Are you ready to add it " +
    					"to the database (y/n)? ");
                            ansAdd = char.Parse(Console.ReadLine());
                            if ((ansAdd == 'y') || (ansAdd == 'Y'))
                            {
                                DataRow part       = tblAutoParts.NewRow();
                                part["PartNumber"] = iPartNumber;
                                part["Year"]       = year;
                                part["Make"]       = strMake;
                                part["Model"]      = strModel;
                                part["PartName"]   = strPartName;
                                part["PartPrice"]  = unitPrice;
                                tblAutoParts.Rows.Add(part);
    
                                dsStoreItems.WriteXml(strFilename);
                            }
                            else
                                Console.WriteLine("The part will not be " +
    					      "added to the database");
                        }
                        else if (typeOfItem == 2)
                        {
                            Random rndPartNumber = new Random();
                            iItemNumber = rndPartNumber.Next(100000, 999999);
    
                            Console.Write("Item/Description: ");
                            strItemName = Console.ReadLine();
    
                        try
                        {
                            Console.Write("Unit Price:       ");
                            unitPrice = double.Parse(Console.ReadLine());
                        }
                        catch (FormatException)
                        {
                            Console.WriteLine("Invalid unit price");
                        }
    
                        Console.WriteLine("\nHere is a summary of" +
    					" the part to be added");
                        Console.WriteLine("--------------------------------");
                        Console.WriteLine("Item Number: {0}", iItemNumber);
                        Console.WriteLine("Name/Descr:  {0}", strItemName);
                        Console.WriteLine("Unit Price:  {0:C}", unitPrice);
                        Console.WriteLine("--------------------------------");
    
                        Console.Write("Are you ready to add it " +
    				  "to the database (y/n)? ");
                        ansAdd = char.Parse(Console.ReadLine());
                        if ((ansAdd == 'y') || (ansAdd == 'Y'))
                        {
                            DataRow item = tblStoreItems.NewRow();
                            item["ItemNumber"] = iItemNumber;
                            item["ItemName"] = strItemName;
                            item["ItemPrice"] = unitPrice;
                            tblStoreItems.Rows.Add(item);
                        
                            dsStoreItems.WriteXml(strFilename);
                        }
                        else
                            Console.WriteLine("The part will not be " +
    					  "added to the database");
                        }
                    }
                    catch (FormatException)
                    {
                        Console.WriteLine("Invalid Menu Selection");
                    }
                } while (typeOfItem == 1 || typeOfItem == 2);
            }
    
            public void ShowInventory()
            {
            }
        }
    }
  4. Accédez au fichier Program.cs et changez le comme suit:
     
    using System;
    
    namespace CollegeParkAutoParts4
    {
        class Program
        {
            static int Main(string[] args)
            {
                Inventory item = new Inventory();
    
                item.CreateStoreItem();
    
                Console.WriteLine();
                return 0;
            }
        }
    }
  5. Exécutez l'application et créez les articles suivants:
     
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 1
    Car Year: 2005
    Make (or None if N/A):  Acura
    Model (or None if N/A): NSX 3.0L V6
    Part Name:              Oil Filter
    Unit Price:             8.85
    
    Here is a summary of the part to be added
    --------------------------------
    Part Number: 421960
    Year:        2005
    Make:        Acura
    Model:       NSX 3.0L V6
    Part Name:   Oil Filter
    Unit Price:  $8.85
    --------------------------------
    Are you ready to add it to the database (y/n)? y
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 1
    Car Year: 2002
    Make (or None if N/A):  Audi
    Model (or None if N/A): Quattro 1.8L Turbo
    Part Name:              Clutch Release Bearing
    Unit Price:             55.50
    
    Here is a summary of the part to be added
    --------------------------------
    Part Number: 234374
    Year:        2002
    Make:        Audi
    Model:       Quattro 1.8L Turbo
    Part Name:   Clash Bear
    Unit Price:  $55.50
    --------------------------------
    Are you ready to add it to the database (y/n)? y
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 1
    Car Year: BMW
    Invalid year
    Make (or None if N/A):  BMW
    Model (or None if N/A): 325I 2.5L L6
    Part Name:              Ignition Coil
    Unit Price:             60.85
    
    Here is a summary of the part to be added
    --------------------------------
    Part Number: 899611
    Year:        2002
    Make:        BMW
    Model:       325i 2.5L L6
    Part Name:   Ignition Coil
    Unit Price:  $60.85
    --------------------------------
    Are you ready to add it to the database (y/n)? n
    The part will not be added to the database
    What type of item do you want to add
    1. An auto part (for a car or an enfine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 1
    Car Year: 2002
    Make (or None if N/A):  BMW
    Model (or None if N/A): 325i 2.5L L6
    Part Name:              Ignition Coil
    Unit Price:             60.85
    
    Here is a summary of the part to be added
    --------------------------------
    Part Number: 761840
    Year:        2002
    Make:        BMW
    Model:       325I 2.5L L6
    Part Name:   Ignition Coil
    Unit Price:  $60.85
    --------------------------------
    Are you ready to add it to the database (y/n)? Y
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 2
    Item/Description:  Soda 2L Bottle
    Unit Price:        1.75
    
    Here is a summary of the part to be added
    --------------------------------
    Item Number: 894761
    Name/Descr:  Soda 2L Bottle
    Unit Price:  $1.75
    --------------------------------
    Are you ready to add it to the database (y/n)? Y
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 2
    Item/Description: 2
    Unit Price:       3
    
    Here is a summary of the part to be added
    --------------------------------
    Item Number: 722464
    Name/Descr:  2
    Unit Price:  $3.00
    --------------------------------
    Are you ready to add it to the database (y/n)? n
    The part will not be added to the database
    What type of item do you want to add
    1. An auto part (for a car or an engine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice:      2
    Item/Description: STP Gas Treatment 3-Pack
    Unit Price:       2.99
    
    Here is a summary of the part to be added
    --------------------------------
    Item Number: 126066
    Name/Descr:  STP Gas Treatment 3-Pack
    Unit Price:  $2.99
    --------------------------------
    Are you ready to add it to the database (y/n)? Y
    What type of item do you want to add
    1. An auto part (for a car or an enfine)
    2. Another type of item, not for a specific car
    0. Stop
    Enter the following pieces of information
    Your Choice: 0
    
    Press any key to continue . . .
  6. Fermez la fenêtre de DOS
  7. Ouvrez le fichier dans un navigateur pour voir le résultat

Ouvrir un ensemble de données

Pour ouvrir les données sauvegardées d'une liste, la classe DataSet fournit la méthode ReadXml() qui est prise en charge dans diverses versions. Une des versions de cette méthode utilise la syntaxe suivante :

public XmlReadMode ReadXml(string fileName);

Cette méthode prend comme argument le nom d'un fichier existant de XML ou son chemin. La méthode ouvre le fichier et fournit le formatage XML comme elle a été faite quand le fichier avait été sauvegardé. Voici un exemple d'appel cette méthode:

using System;
using System.IO;
using System.Data;

namespace VideoCollection
{
    public static  class Program
    {
        static DataSet dsVideos;

        static DataColumn colShelfNumber;
        static DataColumn colTitle;
        static DataColumn colDirector;
        static DataColumn colLength;
        static DataColumn colYear;
        static DataColumn colRating;
        static DataTable tblVideos;

        static string strDirectory;

        static void CreateCollection()
        {
            dsVideos = new DataSet("Videos");

            tblVideos = new DataTable("Video");

            colShelfNumber = new DataColumn("ShelfNumber",
                Type.GetType("System.String"));
            tblVideos.Columns.Add(colShelfNumber);

            colTitle = new DataColumn("Title",
                Type.GetType("System.String"));
            tblVideos.Columns.Add(colTitle);

            colDirector = new DataColumn("Director",
                                         Type.GetType("System.String"));
            tblVideos.Columns.Add(colDirector);

            colLength = new DataColumn("Length",
                                       Type.GetType("System.String"));
            tblVideos.Columns.Add(colLength);

            colYear = new DataColumn("Year",
                                       Type.GetType("System.Int16"));
            tblVideos.Columns.Add(colYear);

            colRating = new DataColumn("Rating",
                                       Type.GetType("System.String"));
            tblVideos.Columns.Add(colRating);

            dsVideos.Tables.Add(tblVideos);

            strDirectory = @"C:\Video Collection";
            Directory.CreateDirectory(strDirectory);
        }

        static void CreateRecord()
        {
            if (File.Exists(strDirectory + @"\videos.xml"))
                dsVideos.ReadXml(strDirectory + @"\videos.xml");

            object[] arrVideo = { "FD-205", "Her Alibi", "Bruce Beresford",
                                     "94 Minute", 1989, "PG-13" };

            DataRow rowVideo = tblVideos.NewRow();
            rowVideo.ItemArray = arrVideo;

            tblVideos.Rows.Add(rowVideo);
            dsVideos.WriteXml(strDirectory + @"\videos.xml");
        }

        static int Main(string[] args)
        {
            CreateCollection();
            CreateRecord();

            return 0;
        }
    }
}

Bien que cette méthode puisse lire n'importe quel fichier XML, si vous l'utilisez pour ouvrir un fichier qui a été sauvegardé par quelqu'un d'autre ou  dans une application différente et vous voulez l'utiliser dans votre application, vous devriez être au courant des noms de ses noeuds. Si elle contient les noms qui «ne sont pas inscrits» ou ne sont pas identifiés par votre objet Dataset, les listes qui composent votre application peuvent ne pas pouvoir la lire, pas parce que la liste n'a pas été bien formatée, mais parce que les listes de votre application contiendraient  des noms différents.

Si le fichier était sauvegardé en utilisant une classe basée sur un Stream, vous pouvez passer un stream à la méthode selon la syntaxe suivante :

public XmlReadMode ReadXml(Stream stream);

De la même manière, la méthode fournit une version équivalente pour le TextWriter et les versions de XmlWriter :

public XmlReadMode ReadXml(TextReader reader);
public XmlReadMode ReadXml(XmlReader reader);

Pour utiliser une de ces versions, vous devez d'abord définir un TextWriter ou un type de variable XmlReader .

pendant le recouvrement du contenu du fichier XML, si vous le voulez délivré comme texte, appelez la méthode DataSet.GetXml (). Sa syntaxe est :

public string GetXml();

Comme vous pouvez voir, cette méthode renvoie  une chaîne String.

Une fois qu'un fichier a été ouvert, vous pouvez explorer son contenu. L'opération la plus évidente liée à l'ouverture d'un ensemble de données consiste à regarder ses enregistrements.

Accepter ou rejeter les changements d'une liste

Quand un utilisateur a créé un enregistrement, l'ensemble de données qui contient l'information est considéré comme avoir été modifié parce que, évidemment, il n'a pas la même information ou les mêmes enregistrements qu'il avait quand l'application a été lancée. Vous, comme programmeur, avez l'option d'accepter les changements ou de les rejeter. Pour accepter les changements, appeler la méthode DataSet.AcceptChanges (). Sa syntaxe est :

public void AcceptChanges();

Si vous ne voulez pas que les changements prennent effet, vous pouvez les rejeter en appelant la méthode DataSet.RejectChanges (). Sa syntaxe est :

public virtual void RejectChanges();

Cette méthode peut être appelée pour écarter tous les changements faits sur les enregistrements d'une ou des liste(s).

 
  

Précédent Copyright © 2007, Yevol Suivant