【问题标题】:How could I find the fields of a SharePoint list from database in SharePoint 2010?如何从 SharePoint 2010 的数据库中找到 SharePoint 列表的字段?
【发布时间】:2012-02-17 18:35:08
【问题描述】:

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

我希望这个问题很清楚(对它的可能性希望不大)。

谢谢,

【问题讨论】:

  • 这是使用服务器对象模型、Web 服务还是什么?
  • 现有系统正在使用我说的数据库表。
  • 这是批处理作业吗? Web 部件?代码是否在服务器上运行?你能在你的代码中使用服务器对象模型吗(即使它只是为了这个部分)?这甚至是 .NET 代码,还是完全使用其他范例?如果有,是什么?
  • 我在问题中添加了更多注释。 C# 代码从数据库结构中读取,以便稍后从中生成一些视图(我不能为此使用 Web 服务或对象模型,因为生成的视图也将使用底层共享点表......)。跨度>
  • 我并没有说重写整个应用程序以使用服务器对象模型(尽管我确实认为您通过依赖内部底层实现将自己挖进了这个坑)。我说使用服务器对象模型来获取列表的字段,然后继续做你正在做的任何其他事情,直到代码也被破坏。

标签: xml sharepoint sharepoint-2010 field sharepoint-list


【解决方案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();
                }
            }
        }

【讨论】:

    【解决方案2】:

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

    jd

    【讨论】:

      猜你喜欢
      • 2017-07-19
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多