使用Content Deployment API做导出的时候,遇到如下错误:
message: System.IndexOutOfRangeException: 在位置 0 处没有任何行。
在 System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex)
在 System.Data.RBTree`1.get_Item(Int32 index)
在 System.Data.DataRowCollection.get_Item(Int32 index)
在 Microsoft.SharePoint.Deployment.ObjectHelper.RetrieveDataFromDatabase(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.FolderObjectHelper.RetrieveData(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.ExportObjectManager.GetObjectData(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.ExportObjectManager.MoveNext()
在 Microsoft.SharePoint.Deployment.ExportObjectManager.ExportObjectEnumerator.MoveNext()
在 Microsoft.SharePoint.Deployment.SPExport.SerializeObjects()
在 Microsoft.SharePoint.Deployment.SPExport.Run()
在 AVEVA.NET.SH.Program.Main(String[] args) 位置 C:\Workspace\TestQuery\SH\Program.cs:行号 1828
在 System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex)
在 System.Data.RBTree`1.get_Item(Int32 index)
在 System.Data.DataRowCollection.get_Item(Int32 index)
在 Microsoft.SharePoint.Deployment.ObjectHelper.RetrieveDataFromDatabase(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.FolderObjectHelper.RetrieveData(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.ExportObjectManager.GetObjectData(ExportObject exportObject)
在 Microsoft.SharePoint.Deployment.ExportObjectManager.MoveNext()
在 Microsoft.SharePoint.Deployment.ExportObjectManager.ExportObjectEnumerator.MoveNext()
在 Microsoft.SharePoint.Deployment.SPExport.SerializeObjects()
在 Microsoft.SharePoint.Deployment.SPExport.Run()
在 AVEVA.NET.SH.Program.Main(String[] args) 位置 C:\Workspace\TestQuery\SH\Program.cs:行号 1828
代码如下:
SPSite site = new SPSite("http://ad-anet:25000/PCenter/KOC");
SPWeb contextWeb = site.OpenWeb();
//临时目录
string temp_path = "d:\\export";
SPExportObject exportObject = new SPExportObject();
exportObject.Id = contextWeb.ID;
exportObject.IncludeDescendants = SPIncludeDescendants.None;
exportObject.Type = SPDeploymentObjectType.Web;
SPExportSettings settings = new SPExportSettings();
settings.IncludeVersions = SPIncludeVersions.LastMajor;
settings.SiteUrl = contextWeb.Site.Url;
settings.ExportMethod = SPExportMethodType.ExportAll;
settings.FileLocation = temp_path;
settings.FileCompression = false;
settings.CommandLineVerbose = true;
settings.ExcludeDependencies = false;
settings.OverwriteExistingDataFile = true;
settings.HaltOnNonfatalError = false;
settings.HaltOnWarning = false;
//settings.IncludeSecurity = SPIncludeSecurity.All;
settings.Validate();
settings.ExportObjects.Add(exportObject);
List<string> workflowasses = new List<string>();
//导出列表和某个folder item
SPExportObject e1 = new SPExportObject();
SPList theList01 = contextWeb.Lists["我的列表"];
e1.Id = theList01.ID;
e1.IncludeDescendants = SPIncludeDescendants.None;
e1.Type = SPDeploymentObjectType.List;
settings.ExportObjects.Add(e1);
SPExportObject eo = new SPExportObject();
SPListItem item = theList01.GetItemById(185);
eo.Id = item.UniqueId;
eo.Type = SPDeploymentObjectType.Folder;
settings.ExportObjects.Add(eo);
SPExport export = new SPExport(settings);
export.Run();
在网上搜索也没有发现可用的信息,非常困惑,使用codeplex上的开源工具“SPDeploymentWizard_Beta2.7_Exe”也出现一样的错误,估计和我的用法基本类似,反编译Microsoft.SharePoint.Deployment也没看出太多头绪,经过反复尝试,发现问题出在Item上,因为老的Item可以,新的Item就有问题,而且是在同一个列表同一个文件夹下,怀疑是和关联的属性相关,于是逐个把属性删光,结果问题依旧。
偶然发现,将settings.IncludeVersions 改为SPIncludeVersions.CurrentVersion,问题突然没有了,难道版本有什么问题吗?查msdn上关于SPIncludeVersions的信息是这样的:
All
Include all versions
CurrentVersion
Include the most recent version
LastMajor
(Default) Include the last major version
LastMajorAndMinor
Include the last major and last minor versions
查看没有问题的条目,发现有一个已经批准的版本1.0,还有一个草稿版本2.0,而有问题的条目,都没有已经批准的条目,于是猜测,LastMajor可能指的是“已批准”的版本,而不是我们通常意义上的大版本(例如版本2.1,2一般认为是大版本,而1是小版本),于是把有问题item也批准,结果没有问题了,能正常导出,但是做这个程序的要求是取最新的版本,所以上述代码改成了:
settings.IncludeVersions = SPIncludeVersions.CurrentVersion;
问题就解决了。
总结:
CurrentVersion指的是最新的版本
LastMajor指的是最后一个批准的版本
LastMajorAndMinor指的是最后一个批准和最新的草稿版本
如果按照msdn上直接理解,是很容易迷惑的。
出现上述问题,估计是由于开始没有取到LastMajor插入到临时表,而从临时表里写xml的时候出的问题。不过我觉得,既然没有取到LastMajor,临时表里没有插入数据,写xml的时候就不要取空行了嘛,这样也不会中断导出。这是我的猜测,若有其他原因也未可知。