2009-06-23 11 views
1

最近、会社では、現在のソリューションに統合する必要があるいくつかの古いプロジェクトからいくつかのMSSQLデータベースを取得しました。.NET XmlReader with 'FOR XML' data

データベースにはFOR XML AUTO句を使用する約100〜150のストアドプロシージャがあるため、クエリでは完全なオブジェクトグラフが行ではなくXMLとして返されます。

データベースから返されたxmlデータに基づいて、シリアライズ可能なクラス(xsd-toolを使用)を作成するのが最も簡単なソリューションです。

これは、我々はそれらのオブジェクトをinstatiateするために使用するコードです:

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は、エンタープライズライブラリからデータベースクラスを表します。

spが大量のデータを返した場合(たとえば、子供、孫、grandgrndchldrn ...オブジェクトがたくさんあるオブジェクトの大きなコレクションなど)、このメソッドの実行は非常に長く続きます。

アプリケーション内のデータは急増し続けますが、これを最適化する必要があります。

これは悪い習慣(FORXML、XmlReaderおよびDeserializeを使用している)か、ストアドプロシージャを書き換えてSqlDataReadersまたはLinq2Sqlを使用するか、このスニペット内にperf.issueがあるかどうか疑問に思っています(不適切な使用ジェネリックまたは他の何か)?


編集 私は一度にデータの大きなammountをロードするために悪い習慣であることを知っている、と私はロード処理が小さな塊に分割されるべきであることを知っているが、何かが間違っている場合、私はただ思ったんだけどこの特定のコードを使用してください。

+0

xmlの大きさはどれくらいですか? –

+0

現在、xmlの返品は1MBから5MBの間です – m1k4

答えて

1

の内容でこの問題を分析する必要があります。 XMLを返すデータは、一度にメモリに格納する必要はありませんか?それをすべてメモリにデシリアライズすれば、おそらく最善のことではありません。データを一度に少しずつ処理するだけであれば、おそらくXMLをXMLとして処理し、XmlReaderを少しずつ読むようにしておくべきです。