2012-01-24 48 views
4

在SharePoint 2003和2007中,有一个名为AllLists的表,其中有一个名为tp_Fields的列,其中包含一个xml,其中包含特定列表的所有字段。如何从SharePoint 2010中的数据库中找到SharePoint列表的字段?

存储在tp_Fields列中的XML的一个例子将是这样一个SharePoint列表与3个字段:

<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数据库的哪些字段与SharePoint 2010中的数据库有关?或者如果可能如何将此varbinary列转换为与之前类似的xml?

我希望问题很清楚(对其可能性tbh几乎没有希望)。

感谢,

+0

这是使用服务器对象模型,Web服务还是什么? – Servy

+0

像我说的那样,现有系统正在使用数据库表。 –

+0

这是批处理作业吗? Web部分?代码是否在服务器上运行?你可以在你的代码中使用服务器对象模型吗(即使它只是用于本节)?这甚至是.NET代码,还是完全使用其他范例?如果是这样,那是什么? – Servy

回答

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(); 
       } 
      } 
     } 
0

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

jd

相关问题