2009-09-28 4 views
1

GetDataTable() 메서드를 사용할 때 문제가 발생했습니다. 내 결과에서 기본 SharePoint 열 "FileRef"를 사용하려고합니다.SPListItemCollection.GetDataTable()이 모든 열을 반환하지 않습니까?

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

ViewFields : 내 SPQuery.ViewFields에

쿼리를 포함

<FieldRef Name='Title' /><FieldRef Name='Category' /><FieldRef Name='FileRef' /><FieldRef Name='ID' /><FieldRef Name='Created' /> 

심지어는 items.XML 반환하지만 GetDataTable()를 호출 할 때 그것이 볼 수 있습니다 데이터 테이블에 넣지 마라.

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

왜 GetDataTable이 제대로 작동하지 않습니까? 내 자신의 전환 방법을 써야합니까?

당신이 코드를 사용할 수 있습니다

답변

1

내가 당신에게 더 나은 솔루션을 권하고 싶습니다

SPListItemCollection 모든 항목의 데이터를 저장하는 XML을의 proeprty이 있기 때문에, 당신은 보통의 XML 형식으로 데이터를 얻을 this XSLT을 사용할 수 있으며 그런 다음 XML에서 DataSet을 만듭니다.

이 아이디어는 편리한 확장 기능으로 변환 할 수 있습니다, 당신은 당신이 아니라, 필요한 경우, 첨부 파일의 URL의 (SPQuery.IncludeAttachmentUrls = true)뿐만 아니라 TRUE/FALSE 값을이 방법을 사용하여, 그런데

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

얻을 것이다 previously mentioned method을 사용하여 얻을 수 있습니다. 제니스에 관한

1

'대답 - 나는 ows_에 문자열을 할 비트를 제거하고 제거하려고 것, 바로 사용 -

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

SP2010은 이제있는 ETag 등의 분야를 포함하기 때문에 어떤 돈' "ows_"로되어 있고 솔루션이 실패합니다. 그렇지 않으면 아주 좋은 해결책.

관련 문제