使用SharePoint API来操作文件,列表对象时,都会用到更新的方法,SharePoint中在更新SPListItem有3个方法:
Updates the database with changes that are made to the list item. (Overrides SPItem.Update().) |
|
Updates the database with changes made to the list item without changing the Modified or Modified By fields. |
|
Updates the item without creating another version of the item. |
在微软的API文档上简单的解释了一下,但是实际在开发的使用中发现这几个API里面的问题有很多,因此工作这些年也遇到了很多坑,这里总结一下,并且对这些API做一些详细的说明。
Update方法
微软的解释是把对当前SPListItem的更改更新到数据库中,这里面更详细的说明下:
- 用来更新属性,此API可以更新属性,但是更新后Modified会变成当前时间和ModifiedBy为当前用户。如果开启了版本控制,会生成一个新的版本。
SPListItem splitemitem = list.GetItemById(1); splitemitem["ColumnName"] = "TestValue"; splitemitem.Update();
- 用来添加SPLitemItem,这种情况必须要用这个方法。
SPList list = web.GetList("/lists/announcements"); SPListItemCollection items = list.Items; SPListItem item = items.Add(); item[SPBuiltInFieldId.Title] = "A new item!"; item[SPBuiltInFieldId.Body] = "This item was added by a call to the Add method."; item[SPBuiltInFieldId.Expires] = DateTime.Now.AddHours(1); item.Update();
UpdateOverwriteVersion
使用Update会产生新的版本,因此UpdateOverwriteVersion方法可以避免这个问题:
SPListItem splitemitem = list.GetItemById(1); splitemitem["ColumnName"] = "TestValue"; splitemitem.UpdateOverwriteVersion();
SystemUpdate
使用上面两个方法都会更改变当前SPLitemItem的Modified和ModifiedBy信息,因此需要SystemUpdate这个方法。
SPListItem splitemitem = list.GetItemById(1); splitemitem["ColumnName"] = "TestValue"; splitemitem.SystemUpdate();
但是在真正的使用过程中,会有一些特殊情况,会影响到上述API的行为,比如在开启了Content Approval功能后,Approved状态的文件一旦被修改,就会增长一个版本。如果文件被签出,使用Update也不会有问题。因此实际在使用中需要根据具体情况来看。