2009-09-28 50 views
1

我在使用GetDataTable()方法時遇到了一個問題。我試圖在我的結果中使用默認的SharePoint列「FileRef」。包括我在我的SPQuery.ViewFieldsSPListItemCollection.GetDataTable()不會返回所有列?

查詢:

<Where><IsNotNull><FieldRef Name='FileRef'/></IsNotNull></Where> 

ViewFields:

我甚至可以看到它返回的items.XML但是當我打電話GetDataTable()是沒有放在數據表中。

SPListItemCollection items = list.GetItems(spq); 
dtItems = items.GetDataTable(); 

爲什麼不GetDataTable正常工作?我將不得不編寫自己的轉換方法嗎?

回答

1

我建議你一個更好的解決方案

由於SPListItemCollection具有存儲所有項目數據的XML的廣告載體,可以使用this XSLT獲得正常的XML格式的數據和然後從XML創建DataSet。

這個想法可以被轉換成方便的擴展功能:使用此方法

using System.Data; 
using System.Xml; 
using System.Xml.Xsl; 
using Microsoft.SharePoint; 

namespace Balticovo.SharePoint 
{ 
    public static partial class Extensions 
    { 
     static string sFromRowsetToRegularXmlXslt = 
       "<xsl:stylesheet version=\"1.0\" " + 
       "xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " + 
       "xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\" " + 
       "xmlns:z=\"#RowsetSchema\">" + 

      "<s:Schema id=\"RowsetSchema\"/>" + 

      "<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" />" + 

      "<xsl:template match=\"/\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;rows&gt;</xsl:text>" + 
       "<xsl:apply-templates select=\"//z:row\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/rows&gt;</xsl:text>" + 
      "</xsl:template>" + 

      "<xsl:template match=\"z:row\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;row&gt;</xsl:text>" + 
       "<xsl:apply-templates select=\"@*\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/row&gt;</xsl:text>" + 
      "</xsl:template>" + 

      "<xsl:template match=\"@*\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;</xsl:text>" + 
       "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" + 
       "<xsl:value-of select=\".\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/</xsl:text>" + 
       "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" + 
      "</xsl:template>" + 
      "</xsl:stylesheet>"; 

     public static DataTable GetFullDataTable(this SPListItemCollection itemCollection) 
     { 
      DataSet ds = new DataSet(); 

      string xmlData = ConvertZRowToRegularXml(itemCollection.Xml); 
      if (string.IsNullOrEmpty(xmlData)) 
       return null; 

      using (System.IO.StringReader sr = new System.IO.StringReader(xmlData)) 
      { 
       ds.ReadXml(sr, XmlReadMode.Auto); 

       if (ds.Tables.Count == 0) 
        return null; 

       return ds.Tables[0]; 
      } 
     } 

     static string ConvertZRowToRegularXml(string zRowData) 
     { 
      XslCompiledTransform transform = new XslCompiledTransform(); 
      XmlDocument tidyXsl = new XmlDocument(); 

      try 
      { 
       //Transformer 
       tidyXsl.LoadXml(Extensions.sFromRowsetToRegularXmlXslt); 
       transform.Load(tidyXsl); 

       //output (result) writers 
       using (System.IO.StringWriter sw = new System.IO.StringWriter()) 
       { 
        using (XmlTextWriter tw = new XmlTextWriter(sw)) 
        { 
         //Source (input) readers 
         using (System.IO.StringReader srZRow = new System.IO.StringReader(zRowData)) 
         { 
          using (XmlTextReader xtrZRow = new XmlTextReader(srZRow)) 
          { 
           //Transform 
           transform.Transform(xtrZRow, null, tw); 
           return sw.ToString(); 
          } 
         } 
        } 
       } 
      } 
      catch 
      { 
       return null; 
      } 
     } 
    } 
} 

順便問一下,你會得到,如果需要的話,文件附件的URL(SPQuery.IncludeAttachmentUrls = true)不只是TRUE/FALSE值作爲你將通過使用previously mentioned method得到它。

1

關於Janis的答案 - 我會刪除該做的一個子上ows_位,並試圖將其刪除,只需使用: -

"<xsl:value-of select=\"name()\"/>" + 

因爲現在SP2010領域包括諸如ETag的其中唐」 t與「ows_」並且解決方案失敗。否則很好的解決方案。