c#SqlDataReader到XElement有效

时间:2011-09-15 08:58:13

标签: c# sql linq xelement

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

目前尝试将其转换为XElement / XDocument以生成多个报告会导致c#方法转换此时间超过30分钟,这需要30分钟的Sql Connection \ Command Timeout,这太长了。 / p>

任何人都可以帮助排查/找到我可以对以下转换代码进行改进的地方,因为在这里某处必须存在巨大的低效率。

电话

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;
    }

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我没有看到任何明显的问题,但我毫不奇怪在内存中将250K行转换为xml会烧毁你的CPU。

您可以做的一件事是// ize过程(例如,每个resultSet一个线程)

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