2009-09-28 2 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 proeprty, который хранит все данные позиции, вы можете использовать this XSLT, чтобы получить данные в формате XML нормального и затем создайте DataSet из XML.

Эта идея может быть преобразована в удобную функцию расширения:

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

Что касается Яниса ответ - я бы удалить биты, которые делают подстроку на ows_ и попытаться удалить его, просто использовать: -

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

потому что SP2010 теперь включает в себя такие области, как ETag, которые дон» t с «ows_», и решение не выполняется. Очень хорошее решение в противном случае.

Смежные вопросы