1

最近,在公司中,我们从一些旧项目中获得了一些 MSSQL 数据库,我们必须将其集成到当前解决方案中。

数据库有大约 100-150 个使用 FOR XML AUTO 子句的存储过程,因此查询返回完整的对象图作为 XML 而不是行。

最快的解决方案(对于我们公司而言)是基于从数据库返回的 xml 数据创建可序列化的类(使用 xsd 工具)。

这是我们用来实例化这些对象的代码:

 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 和反序列化),或者我们应该重写存储过程并使用 SqlDataReaders 或 Linq2Sql,或者这个片段中有一些 perf.issue(不正确使用泛型或其他东西) ?


编辑 我知道一次加载大量数据是不好的做法,而且我知道加载过程应该分成更小的块,但我只是想知道这段特定的代码是否有问题。

4

1 回答 1

1

您需要根据返回的 XML 中内容来分析这个问题。XML 是否返回不需要一次全部在内存中的数据?然后将其全部反序列化到内存中可能不是最好的事情。如果您一次只需要处理一点数据,那么您或许应该将 XML 处理为 XML 并保留 XmlReader 以便一次读取一点。

于 2009-06-24T00:15:10.390 回答