2009-06-23 10 views
1

Kürzlich, in der Firma haben wir einige MSSQL-Datenbank von einem alten Projekt, das wir in die aktuelle Lösung integrieren müssen..NET XmlReader mit 'FOR XML' Daten

Die Datenbank enthält etwa 100-150 gespeicherte Prozeduren, die FOR XML AUTO-Klausel verwenden, sodass Abfragen vollständiges Objektdiagramm als XML anstelle von Zeilen zurückgeben.

Die schnellste Lösung (für uns in der Firma) war das Erstellen serialisierbarer Klassen (mit xsd-tool) basierend auf den XML-Daten, die von der Datenbank zurückgegeben wurden.

Dies ist Code, den wir diese Objekte instatiate verwenden:

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-Datenbank-Klasse von Enterprise-Bibliothek darstellt.

Wenn sp viele Daten zurückgibt (zum Beispiel einige große Sammlung von Objekten mit vielen Kindern, Enkel, grandgrndchldrn ... Objekte darin) Ausführung dieser Methode dauert sehr lange.

Die Daten in der Anwendung werden surrtly weiter wachsen, und ich muss daran denken, dies zu optimieren.

Also, ich frage mich, ob dies schlechte Praxis ist (mit FORXML, XmlReader und Deserialize), oder wir sollten gespeicherte Prozeduren neu schreiben und SqlDataReaders oder Linq2Sql verwenden, oder es gibt einige perf.issue in diesem Snippet (unsachgemäße Verwendung von Generika oder etwas anderes)?


bearbeitet Ich weiß, dass es eine schlechte Praxis ist auf einmal große ammount von Daten zu laden, und ich weiß, dass Ladeprozess auf kleinere Stücke aufgeteilt werden soll, aber ich frage mich nur, wenn etwas nicht in Ordnung ist mit diesem bestimmten Stück Code.

+0

Wie groß ist das XML? –

+0

Gegenwärtig sind XML-Returns zwischen 1 MB und 5 MBs – m1k4

Antwort

1

Sie müssen dieses Problem im Hinblick darauf analysieren, was in XML zurückgegeben wird. Gibt der XML-Code Daten zurück, die nicht alle gleichzeitig im Speicher vorhanden sein müssen? Dann ist das Deserialisieren alles in Erinnerung wahrscheinlich nicht das beste. Wenn Sie die Daten nur ein wenig nach dem anderen verarbeiten müssen, sollten Sie die XML-Datei möglicherweise als XML verarbeiten und den XmlReader immer bei sich tragen lassen, damit er nach und nach gelesen werden kann.