c# SqlDataReader to XElement Efficiently

本文关键字:Efficiently XElement to SqlDataReader | 更新日期: 2023-09-27 18:08:53

我有一个Sql SP,运行大约需要1分钟,返回25000行数据。(可以返回多个数据集)。

目前试图将其转换为XElement/XDocument以生成几个报告,结果在c#方法中转换它需要超过30分钟,这需要30分钟的Sql Connection'Command Timeout,这实在太长了。

谁能帮助排除故障/找到我可以改进以下转换代码的地方,因为在这里的某个地方一定存在巨大的效率低下。

调用

public void xyzCall()
{
  ....
  XElement result = SqlDataReadertoXML(sqlcommand.ExecuteReader());
  ....
}

转换函数

    private XElement SqlDataReadertoXML(SqlDataReader datareader)
    {
            XElement results = new XElement("ResultSets");
            // Read Next RecordSet
            do
            {
                XElement result = new XElement("ResultSet");
                //Read Next Row in this RecordSet
                while (datareader.Read())
                {
                    XElement datanode = new XElement("Item");
                    // Read Each Column in this RecordSet
                    for (int i = 0; i < datareader.FieldCount; i++)
                    {
                        // Node.Attr("Name") = Column Name, Node.Value = Field
                        if (datareader.GetName(i) != "") datanode.Add(new XElement(datareader.GetName(i), datareader[i].ToString()));
                    }
                    result.Add(datanode);
                }
                results.Add(new XElement(result));
            } while (datareader.NextResult());
            datareader.Close();
            return results;
    }

c# SqlDataReader to XElement Efficiently

如果您可以访问数据库,我建议您修改SP或编写新的SP以更快的首选XML格式返回数据。对于大型数据集,在内存中构建XML不是一个好主意。

  1. FOR XML AUTO - XML的简单嵌套树,每一列表示为单个元素
  2. FOR XML RAW -结果集中的每一行都转换为通用元素标签
  3. FOR XML EXPLICIT—为结果集
  4. 创建预定义的XML格式
  5. FOR XML PATH—与EXPLICIT模式的大部分功能相同,但是元素和属性可以像语法
  6. 一样使用XPATH构建。
参考

我没有看到任何明显的问题,但是我并不惊讶将250K行转换为内存中的xml会消耗您的CPU。

您可以做的一件事是//调整进程(例如每个resultSet一个线程)

我将使用SQL Server的for xml子句代替!