2011-09-15 17 views
0

我有一個Sql SP需要大約1分鐘運行,返回25,000行數據。 (可以返回多個數據集)。c#SqlDataReader高效地XElement

當前嘗試將此轉換爲XElement/XDocument以生成多個報表,結果是c#方法將此轉換超過30分鐘,這需要30分鐘的Sql Connection \ Command超時,這太長了。

任何人都可以幫助排除故障/找到我可以改進以下轉換代碼,因爲在這裏必須有一個巨大的低效率。

呼叫

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

您對LINQ to XML是否是瓶頸有何把握?如果你取出LINQ to XML位,但仍然獲取所有數據(仍然調用'datareader.GetName(i)'和'datareader [i] .ToString()')需要多長時間? –

回答

4

如果你有對數據庫的訪問,我建議你修改SP或寫入新的SP在首選XML返回數據格式會更快。在內存中構建XML對於大型數據集不是一個好主意。

  1. FOR XML AUTO - XML與每列的簡單的嵌套樹被表示爲單個元件
  2. FOR XML RAW - 在結果集中的每一行被變換爲通用的元素標籤
  3. FOR XML顯 - 預定義的XML格式的結果集
  4. FOR XML路徑中創建 - 大部分相同的功能顯式模式中,但是元素和屬性可以與XPATH被建立像語法

Reference

0

我沒有看到任何明顯的問題,但我並不感到驚訝的是,在內存中將250K行轉換爲xml可能會燒燬您的CPU。

一兩件事你可以做的是// IZE過程(每一個的resultSet線爲例)

我會使用SQL Server的for xml條款,而不是!