如何从SharePoint 2010中的数据库中找到SharePoint列表的字段?

The*_*ght 5 xml sharepoint field sharepoint-2010 sharepoint-list

在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" />
Run Code Online (Sandbox Code Playgroud)

我们有一个应用程序正在使用C#代码从该列读取,例如

var tpFields = (String) drView["tp_Fields"];
Run Code Online (Sandbox Code Playgroud)

在SharePoint 2010中,此列的数据类型已更改为varbinary,而是仅包含一些二进制数据!

(我知道理想/推荐的解决方案是使用SharePoint Web服务或SharePoint对象模型而不依赖于基础表,但不幸的是我们有一个现有的应用程序,我们也需要使它与2010一起工作.我希望我们不必重新设计一切!)

我如何知道SharePoint列表中SharePoint数据库中的哪些字段?或者如果可能的话,如何将此varbinary列转换为与之前相同的xml?

我希望这个问题很明确(对它的可能性没什么希望).

谢谢,

The*_*ght 2

只是为了分享,我编写了下面的方法,它现在可以从中提取 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();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)