使用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的时候就不要取空行了嘛,这样也不会中断导出。这是我的猜测,若有其他原因也未可知。

posted on 2009-12-24 16:13  重金属  阅读(10232)  评论(0编辑  收藏  举报