2009-06-23 8 views
1

Récemment, en entreprise, nous avons obtenu une base de données MSSQL à partir d'un ancien projet que nous devons intégrer dans la solution actuelle..NET XmlReader avec les données 'FOR XML'

La base de données contient environ 100 à 150 procédures stockées qui utilisent la clause FOR XML AUTO, de sorte que les requêtes renvoient un graphe d'objet complet au format XML au lieu de lignes.

La solution la plus rapide (pour nous en entreprise) était de créer des classes sérialisables (avec xsd-tool) basées sur les données xml renvoyées à partir de la base de données.

C'est le code que nous utilisons pour instatiate ces objets:

public static T GetObjectFromXml<T>(DbCommand command) 
    { 
     SqlDatabase db = (SqlDatabase)DB; 
     XmlReader xmlReader = null; 
     T returnValue; 

     xmlReader = db.ExecuteXmlReader(command); 
     xmlReader.MoveToContent(); 

     XmlSerializer serializer = new XmlSerializer(typeof(T)); 

     returnValue = (T)serializer.Deserialize(xmlReader); 

     xmlReader.Close(); 

     return returnValue; 


    } 

DB représente la classe de base de données de la bibliothèque de l'entreprise.

Lorsque sp retourne beaucoup de données (par exemple une grande collection d'objets avec beaucoup d'objets enfants, petits-enfants, grandgrndchldrn ...), l'exécution de cette méthode dure très longtemps.

Les données dans l'application continueront de croître de manière surréaliste, et je dois penser à optimiser cela. Donc, je me demande si c'est une mauvaise pratique (en utilisant FORXML, XmlReader et Deserialize), ou nous devons réécrire les procédures stockées et utiliser SqlDataReaders ou Linq2Sql, ou il y a du perf.issue dans cet extrait (utilisation incorrecte de génériques ou autre chose)?


Modifier Je sais qu'il est une mauvaise pratique de charger grande ammount de données à la fois, et je sais que le processus de charge doit être divisé pour des morceaux plus petits, mais je me demande si quelque chose est faux avec ce morceau de code particulier.

+0

Quelle est la taille du fichier XML? –

+0

Actuellement, les retours de xml sont entre 1 Mo et 5 Mo – m1k4

Répondre

1

Vous devez analyser ce problème en termes de dans le code XML renvoyé. Le XML renvoie-t-il des données qui n'ont pas besoin d'être en mémoire en même temps? Puis désérialiser tout cela dans la mémoire n'est probablement pas la meilleure chose. Si vous avez seulement besoin de traiter les données un peu à la fois, alors vous devriez peut-être traiter le XML en XML et garder le XmlReader pour lire un peu à la fois.