Pregunta

Recientemente, en compañía obtuvimos una base de datos MSSQL de algún proyecto antiguo que tenemos que integrar en la solución actual.

La base de datos tiene aproximadamente 100-150 procedimientos almacenados que usan la cláusula FOR XML AUTO, de modo que las consultas devuelven un gráfico de objeto completo como XML en lugar de filas.

La solución más rápida (para nosotros en la empresa) fue crear clases serializables (con xsd-tool) basadas en los datos xml devueltos por la base de datos.

Este es el código que usamos para instaurar esos objetos:

 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 representa la clase de base de datos de la biblioteca empresarial.

Cuando sp devuelve muchos datos (por ejemplo, una gran colección de objetos con muchos hijos, nietos, grandgrndchldrn ... objetos en él) la ejecución de este método dura mucho tiempo.

Los datos en la aplicación continuarán creciendo, y debo pensar en optimizar esto.

Entonces, me pregunto si esto es una mala práctica (usando FORXML, XmlReader y Deserialize), o deberíamos reescribir los procedimientos almacenados y usar SqlDataReaders o Linq2Sql, o si hay algún problema en este fragmento (uso incorrecto de genéricos o algo más)?


Editar Sé que es una mala práctica cargar una gran cantidad de datos de una vez, y sé que el proceso de carga debe dividirse en fragmentos más pequeños, pero me pregunto si algo está mal con este fragmento de código en particular.

¿Fue útil?

Solución

Debe analizar este problema en términos de lo que es en el XML que se devuelve. ¿El XML devuelve datos que no necesitan estar en la memoria de una vez? Entonces deserializarlo todo en la memoria probablemente no sea lo mejor. Si solo necesita procesar los datos un poco a la vez, entonces quizás debería procesar el XML como XML y mantener el XmlReader para leer un poco a la vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top