Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#SqlDataReader可高效执行XElement_C#_Sql_Linq_Xelement - Fatal编程技术网

c#SqlDataReader可高效执行XElement

c#SqlDataReader可高效执行XElement,c#,sql,linq,xelement,C#,Sql,Linq,Xelement,我有一个Sql SP,运行大约需要1分钟,返回25000行数据。(可以返回多个数据集) 当前尝试将其转换为XElement/XDocument以生成多个报告,结果c#方法转换此文件需要30分钟以上,这需要Sql Connection\Command超时30分钟,这太长了 有人能帮我解决问题/找到我可以改进以下转换代码的地方吗,因为这里的某个地方肯定存在巨大的低效率 电话 public void xyzCall() { .... XElement result = SqlDataReade

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

当前尝试将其转换为XElement/XDocument以生成多个报告,结果c#方法转换此文件需要30分钟以上,这需要Sql Connection\Command超时30分钟,这太长了

有人能帮我解决问题/找到我可以改进以下转换代码的地方吗,因为这里的某个地方肯定存在巨大的低效率

电话

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;
    }
私有XElement SqlDataReadertoXML(SqlDataReader datareader) { XElement结果=新XElement(“结果集”); //读取下一个记录集 做 { XElement结果=新XElement(“结果集”); //读取此记录集中的下一行 while(datareader.Read()) { XElement数据节点=新XElement(“项目”); //读取此记录集中的每一列 对于(int i=0;i如果您有权访问数据库,我建议您修改SP或编写一个新的SP,以更快地以首选XML格式返回数据。对于大型数据集,在内存中构建XML不是一个好主意

  • 对于XML,自动简单嵌套的XML树,每个列表示为单个元素
  • 对于XML原始-结果集中的每一行都转换为通用元素标记
  • FOR XML EXPLICIT-为结果集创建预定义的XML格式
  • 对于XML路径-功能与显式模式基本相同,但元素和属性可以使用类似XPATH的语法构建

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

  • 对于XML,自动简单嵌套的XML树,每个列表示为单个元素
  • 对于XML原始-结果集中的每一行都转换为通用元素标记
  • FOR XML EXPLICIT-为结果集创建预定义的XML格式
  • 对于XML路径-功能与显式模式基本相同,但元素和属性可以使用类似XPATH的语法构建

  • 我看不出任何明显的问题,但将内存中的250K行转换为xml会消耗CPU,这并不奇怪

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


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

    我看不出任何明显的问题,但将内存中的250K行转换为xml会消耗CPU,这并不奇怪

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


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

    您有多确定LINQ到XML是瓶颈?如果去掉LINQ到XML位,但仍然获取所有数据(仍然调用
    datareader.GetName(i)
    datareader[i].ToString()
    ),需要多长时间?您有多确定LINQ到XML是瓶颈?如果去掉LINQ到XML位,但仍然获取所有数据(仍然调用
    datareader.GetName(i)
    datareader[i].ToString()
    ),需要多长时间?