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

时间:2012-01-24 14:01:42

标签: xml sharepoint sharepoint-2010 field 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" />

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

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

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

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

我如何知道SharePoint列表在SharePoint 2010中的数据库中有哪些字段?或者如果可能的话,如何将这个varbinary列转换为它之前的等效xml?

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

谢谢,

2 个答案:

答案 0 :(得分: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();
                }
            }
        }

答案 1 :(得分:0)

我已经做了很长时间了,发现了一个名为SPViews的实用程序。您将其指向内容数据库,并生成SQL脚本以为您创建视图。它读取压缩字段以获取列并生成脚本。你可以从那里得到列。

jd

相关问题