7

我有一个场景,我必须将SharePoint 2010列表(name =“VersionTestList”)中的所有数据移动到SQL Server数据库。由于列表中启用了版本控制,因此我也想移动以前的版本详细信息。无论如何,我能够移动最新的项目,但不幸的是我无法获得以前的版本数据。我已经尝试过使用客户端对象模型并能够获取版本,但无法获取相应版本的ListItem。请在下面找到我迄今为止试过的代码,并帮我解决这个问题。以编程方式使用客户端对象模型获取ListItemVersion SharePoint 2010

而且,这是我在列表项的版本是这样的:

string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000"; 
File file = web.GetFileByServerRelativeUrl(path); 
clientContext.Load(file, item=>item.ListItemAllFields); 
FileVersionCollection versions = file.Versions; 
clientContext.Load(versions); 
oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
clientContext.ExecuteQuery(); 

我的整个代码是这样的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     GetVersionsUsingCOM(); 
    } 
    public static void GetVersionsUsingCOM() 
    { 
     File file; 
     FileVersionCollection versions; 
     IEnumerable<Microsoft.SharePoint.Client.FileVersion> oldVersions; 
     ClientContext clientContext = new ClientContex("http://server:1200/test/Poc"); 
     Web web = clientContext.Web; 
     clientContext.Load(web); 
     clientContext.ExecuteQuery(); 

     string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000"; 
     file = web.GetFileByServerRelativeUrl(path); 
     clientContext.Load(file, item=>item.ListItemAllFields); 
     //clientContext.ExecuteQuery(); 

     versions = file.Versions; 
     clientContext.Load(versions); 
     oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
     clientContext.ExecuteQuery(); 

     if (oldVersions != null) 
     { 
      foreach (Microsoft.SharePoint.Client.FileVersion _version in oldVersions) 
      { 
       int count=0; 
       Console.WriteLine(_version.CheckInComment); 
       Console.WriteLine("Version : {0}", _version.VersionLabel); 

      //// Working fine till here but unable to get the version details from version.Url 
       string versionItemUrl = web.ServerRelativeUrl +"/" + _version.Url; 
       File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl); 
       clientContext.Load(oldFile, f=>f.ListItemAllFields); 
       clientContext.ExecuteQuery(); 

       Console.WriteLine(oldFile.ListItemAllFields["Name"]); 
       count++; 
      } 
      oldVersions = null; 
     } 
     Console.ReadLine(); 

    } 
} 

回答

-1

你应该能够得到使用SPFileVersion.Properties列表项数据它会给你一个文件的metedata的散列表,见MSDN - SPFileVersion.Properties Property

里面你foreach尝试

Hashtable oHash = oFileVersion.Properties; 
ICollection collKeys = oHash.Keys; 

foreach (object oKey in collKeys) 
{ 
    Console.WriteLine(oKey.ToString() + " :: " + oHash[oKey.ToString()].ToString()); 
} 
+1

Server对象模型类不提供尝试利用客户端对象模型时有太多帮助。 – 2013-11-11 13:33:12

0

您必须初始化web.ServerRelativeUrl这样

oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
clientContext.Load(web, w => w.ServerRelativeUrl); 
clientContext.ExecuteQuery(); 
+0

不幸的是,我得到了'指定的对象不属于一个列表。'# – PeterX 2015-06-11 04:42:05

+0

如果我使用'var oldFile = web.GetFileByServerRelativeUrl(“/”+ _version.Url); clientContext.Load(file,item => item.ListItemAllFields); clientContext.ExecuteQuery();'我得到'值不在预期的范围内.'错误。 – PeterX 2015-06-11 04:51:28

0

你可以获取较旧版本的文件中像这样

string versionItemUrl = file.ServerRelativeUrl.Replace(Path.GetFileName(file.ServerRelativeUrl),"") + _version.Url;
File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl); clientContext.Load(oldFile, f=>f.ListItemAllFields);
clientContext.ExecuteQuery();
相关问题