在SharePoint 2003和2007中,有一个名为AllLists的表,其中有一个名为tp_Fields的列,其中包含一个包含特定列表的所有字段的xml.
存储在tp_Fields列中的xml示例对于包含3个字段的SharePoint列表是这样的:
<FieldRef Name="ContentTypeId" /> <FieldRef Name="_ModerationComments" ColName="ntext1" /> <FieldRef Name="WebPartTypeName" ColName="nvarchar9" />
var tpFields = (String) drView["tp_Fields"];
在SharePoint 2010中,此列的数据类型已更改为varbinary,而是仅包含一些二进制数据!
(我知道理想/推荐的解决方案是使用SharePoint Web服务或SharePoint对象模型而不依赖于基础表,但不幸的是我们有一个现有的应用程序,我们也需要使它与2010一起工作.我希望我们不必重新设计一切!)
我如何知道SharePoint列表中SharePoint数据库中的哪些字段?或者如果可能的话,如何将此varbinary列转换为与之前相同的xml?
我希望这个问题很明确(对它的可能性没什么希望).
谢谢,
解决方法
为了分享,我编写了下面的方法,它现在可以从中提取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(); } } }