1

最近、会社では、現在のソリューションに統合する必要のある古いプロジェクトからMSSQLデータベースを入手しました。

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

(社内の)最も迅速な解決策は、データベースから返されたxmlデータに基づいて(xsd-toolを使用して)シリアル化可能なクラスを作成することでした。

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

 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があるのか​​(ジェネリックスなどの不適切な使用) )?


編集 一度に大量のデータをロードするのは悪い習慣であり、ロードプロセスを小さなチャンクに分割する必要があることは知っていますが、この特定のコードに何か問題があるのではないかと思っています。

4

1 に答える 1

1

返されるXMLの内容に関して、この問題を分析する必要があります。XMLは、一度にメモリ内にある必要のないデータを返しますか?次に、それをすべてメモリに逆シリアル化することは、おそらく最良のことではありません。一度に少しだけデータを処理する必要がある場合は、XMLをXMLとして処理し、XmlReaderを保持して一度に少しずつ読み取る必要があります。

于 2009-06-24T00:15:10.390 に答える