5

在 SharePoint 2003 和 2007 中,有一个名为 AllLists 的表,其中有一个名为 tp_Fields 的列,其中包含一个包含特定列表的所有字段的 xml。

对于具有 3 个字段的 SharePoint 列表,存储在 tp_Fields 列中的 xml 示例如下:

<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?

我希望这个问题很清楚(对它的可能性几乎没有希望)。

谢谢,

4

2 回答 2

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();
                }
            }
        }
于 2012-01-24T16:44:49.087 回答
0

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

京东

于 2013-07-12T17:35:33.890 回答