2012-01-24 45 views
4

在SharePoint 2003和2007中,有一個名爲AllLists的表,其中有一個名爲tp_Fields的列,其中包含一個xml,其中包含特定列表的所有字段。如何從SharePoint 2010中的數據庫中找到SharePoint列表的字段?

存儲在tp_Fields列中的XML的一個例子將是這樣一個SharePoint列表與3個字段:

<FieldRef Name="ContentTypeId" /> 
<FieldRef Name="_ModerationComments" ColName="ntext1" /> 
<FieldRef Name="WebPartTypeName" ColName="nvarchar9" /> 

我們有從該柱,使用C#代碼例如讀取的應用

var tpFields = (String) drView["tp_Fields"]; 

在SharePoint 2010中,這一列的數據類型已更改爲VARBINARY和僅包含一些二進制數據,而不是!我知道理想的/推薦的解決方案是使用SharePoint Web服務或SharePoint對象模型,而不依賴於底層表,但不幸的是,我們有一個現有的應用程序,我們需要使它與2010年一起工作。我希望我們不必重新設計所有內容!)

如何知道SharePoint列表中SharePoint數據庫的哪些字段與SharePoint 2010中的數據庫有關?或者如果可能如何將此varbinary列轉換爲與之前類似的xml?

我希望問題很清楚(對其可能性tbh幾乎沒有希望)。

感謝,

+0

這是使用服務器對象模型,Web服務還是什麼? – Servy

+0

像我說的那樣,現有系統正在使用數據庫表。 –

+0

這是批處理作業嗎? Web部分?代碼是否在服務器上運行?你可以在你的代碼中使用服務器對象模型嗎(即使它只是用於本節)?這甚至是.NET代碼,還是完全使用其他範例?如果是這樣,那是什麼? – Servy

回答

1

只是爲了分享,我寫了下面的方法,它現在可以從中提取的XML雖然沒有保證由於生成的XML是與SharePoint 2003/2007兼容。

private static string getXmlFromTpFields(byte[] tpFields) 
     { 
      using (var memoryStream = new MemoryStream(tpFields)) 
      { 
       // ignore the first 14 bytes; I'm not sure why but it works! 
       for (var index = 0; index <= 13; index++) 
        memoryStream.ReadByte(); 

       var deflateStream = new DeflateStream(memoryStream, CompressionMode.Decompress); 

       using (var destination = new MemoryStream()) 
       { 
        deflateStream.CopyTo(destination); 

        var streamReader = new StreamReader(destination); 
        destination.Position = 0; 
        return streamReader.ReadToEnd(); 
       } 
      } 
     } 
0

我一直這樣做了很長時間,發現一個名爲SPViews的應用程序。您將其指向內容數據庫並生成SQL腳本以爲您創建視圖。它讀取壓縮字段以獲取列並生成腳本。你可以從那裏得到列。

jd

相關問題