2010-09-18 16 views
0

J'utilise un DataGrid pour afficher un fichier XML. Le DataSource Grid est un DataSet typé. (Schéma à l'aide)
Créer un objet DataSet typé (C#)

Assembly assembly = Assembly.GetExecutingAssembly(); 
    Stream stream = assembly.GetManifestResourceStream("XML_Reader.Resources.schema.xsd"); 
    XmlSchemaSet schemas = new XmlSchemaSet(); 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas.Add(null, XmlReader.Create(stream)); 
    using (XmlReader reader = XmlReader.Create(xmlFile, settings)) 
    { 
     newDataSet.ReadXml(reader); 
    } 
    dataGrid.DataSource = newDataSet; 


J'ai ajouté un schéma XSD à mon projet et utilisé Msdatasetgenerator pour générer le NewDataSet. (VS2008).
Maintenant, je veux créer un nouvel objet DataSet pour chaque nouveau fichier (hierarchical xml) que j'ai lu.

La création d'un nouvel objet DataSet n'est pas un problème, mais les types de données ne sont pas corrects, donc je ne peux pas les trier correctement (en particulier les champs numériques). À mon avis, je dois créer un nouveau Typed DataSet.

Alors, comment puis-je résoudre ce problème?

+0

typées sont créés datasets au moment de la conception, pas l'exécution. –

+0

Mais lors de la lecture d'un nouveau fichier xml, j'ai besoin d'effacer le DataSet. ('NewDataSet.Clear();') Parce que je lis les fichiers xml «volumineux» (40 Mo), effacer le DataSet est très lent. Comment puis-je accélérer cette suppression sans créer de nouveau DataSet? –

Répondre

-1

Permettez-moi de répondre à ma propre question ;-))

Un DataSet typé est simplement une classe, vous pouvez instancier comme tout autre class.There est pas de magie à quoi que ce soit généré par les outils, ces outils génèrent simplement des classes et vous pouvez utiliser ces classes de la même manière que vous utilisez d'autres classes.

NewDataSet d1 = new NewDataSet(); où vous placez le bon nom de classe là au lieu de "NewDataSet".

0

Datasets in Visual Studio Overview -

dactylographié Versus non typés Datasets

dataset A saisi est un ensemble de données qui est d'abord dérivé de la classe d'ensemble de données de base et utilise ensuite les informations du concepteur d'ensemble de données, qui est stocké dans un fichier .xsd, pour générer une nouvelle classe de jeu de données fortement typée. Les informations provenant du schéma (tables, colonnes, etc.) sont générées et compilées dans cette nouvelle classe de jeu de données en tant qu'ensemble d'objets et de propriétés de première classe. Comme un ensemble de données typé hérite de la classe DataSet de base, la classe typée assume toutes les fonctionnalités de la classe DataSet et peut être utilisée avec des méthodes qui prennent comme paramètre une instance d'une classe DataSet.
Un ensemble de données non typé, en revanche, n'a pas de schéma intégré correspondant. Comme dans un jeu de données typé, un jeu de données non typé contient des tables, des colonnes, etc., mais ceux-ci sont uniquement exposés en tant que collections. (Cependant, après avoir créé manuellement les tables et d'autres éléments de données dans un ensemble de données typées, vous pouvez exporter la structure de l'ensemble de données en tant que schéma en utilisant la méthode WriteXmlSchema de l'ensemble de données.)

Oui, vous pouvez générer automatiquement ces derniers avec Visual Studio:

Ou, vous pouvez créer vos propres DataSets fortement typés (ce qui est plus propre OMI). Exemple:

using System.Data; 

public class CatsDataTable : DataTable 
{ 
    public CatsDataTable() : base() 
    { 
    base.TableName = "cats"; 
    Columns.Add(new DataColumn(SqlTokens.id_cats, typeof(int))); 
    Columns.Add(new DataColumn(SqlTokens.owners_id_owners, typeof(int))); 
    Columns.Add(new DataColumn(SqlTokens.cats_name, typeof(string))); 
    Columns.Add(new DataColumn(SqlTokens.cats_number_of_spots, typeof(int))); 
    } 
} 

public class OwnersDataTable : DataTable 
{ 
    public OwnersDataTable() : base() 
    { 
    base.TableName = "owners"; 
    Columns.Add(new DataColumn(SqlTokens.id_owners, typeof(int))); 
    Columns.Add(new DataColumn(SqlTokens.owners_name, typeof(string))); 
    } 
} 

public class PetsDataSet : DataSet 
{ 
    public PetsDataSet() : base() 
    { 
    base.TableName = "pets"; 
    Tables.Add("cats"); 
    Tables.Add("owners"); 
    } 
} 

Tangent à propos de Garbage Collection

collecte des ordures (GC) est une forme de gestion automatique de la mémoire. C'est un cas particulier de gestion des ressources, dans lequel la ressource limitée gérée est la mémoire.Le garbage collector, ou simplement le collecteur, tente de récupérer des déchets ou de la mémoire occupée par des objets qui ne sont plus utilisés par le programme. (Wikipedia)
+1

La page (*** Comment: créer un jeu de données typé ***) que vous avez demandé n'a pas pu être trouvée. Mais après en avoir généré automatiquement un avec Visual Studio, vous pouvez utiliser cette classe en créant un nouveau DataSet pour chaque fichier. L'ancien sera ramassé par .NET. –

+0

@Robertico: merci d'avoir signalé la faute de frappe dans mon message (+1), je l'ai corrigé. Cependant, créer des définitions de classe (que ce soit en utilisant un outil de génération de code ou non) et Garbage Collection sont deux concepts différents, et je ne suis pas sûr que vous compreniez la différence. J'ai ajouté quelques liens dans ma réponse. – JohnB

+0

@JohnB: Je comprends les concepts et j'ai aussi utilisé la Garbage Collection. –