1


0

最近、社内でいくつかの古いプロジェクトからMSSQLデータベースを取得し、それらを現在のソリューションに統合する必要があります。

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

最速の解決策(社内の私たちにとって)は、データベースから返されたxmlデータに基づいて(xsd-toolを使って)直列化可能クラスを作成することでした。

これは、これらのオブジェクトをインスタンス化するために使用するコードです。

public static T GetObjectFromXml(DbCommandコマンド){SqlDatabase db =(SqlDatabase)DB;} XmlReader xmlReader = null。 T returnValue;

xmlReader = db.ExecuteXmlReader(コマンド); xmlReader.MoveToContent();

XmlSerializerシリアライザ=新しいXmlSerializer(typeof(T));

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

xmlReader.Close();

returnValueを返します。

}

DBは、エンタープライズライブラリからのデータベースクラスを表します。

spが大量のデータ(例えば、多数の子、孫、grandgrndchldrn …​オブジェクトを含む多数のオブジェクトのコレクション)を返す場合、このメソッドの実行は非常に長く続きます。

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

だから、私はこれが悪い習慣(FORXML、XmlReaderとDeserializeを使う)か、ストアドプロシージャを書き換えてSqlDataReadersかLinq2Sqlを使うべきか、あるいはこの断片の中に何らかのperf.issueがあるかどうか疑問に思う)?

'' '' '

*編集*一度に大量のデータをロードするのは悪い習慣であることを知っています、そしてロードプロセスは小さな塊に分割されるべきだと私は知っています、しかし私は何かがこの特定のコード部分で悪いのかどうか疑問に思います。

1 Answer


1


XMLが何を返すのかという点で、この問題を分析する必要があります。 XMLは、一度にメモリーに入れる必要のないデータを返しますか? それから、それらすべてをメモリにデシリアライズするのはおそらく最善の方法ではありません。 データを少しずつ処理するだけでよい場合は、XMLをXMLとして処理し、XmlReaderを少しずつ読んでおくことをお勧めします。