在SharePoint 周报功能开发中,遇到一个需求,要求能定时备份列表的数据。web
明确需求后须要考虑如何实现功能,备份步骤以下app
1. 筛选数据webapp
2. 复制数据ide
3. 新增到备份列表工具
咱们能够用代码实现数据的备份,然而要考虑的是如何启动这个开关。有两种思路网站
1. 添加Ribbon 按钮手动控制备份,在列表选中相对应的数据,点击Ribbon按钮进行备份ui
2. 新增一个计时器任务(TimeJob),按需求筛选符合条件的数据,新增到备份列表中,代码托管给计时器任务,能够实现定时备份的功能this
考虑到ribbon按钮的权限问题,及手动筛选数据,手动备份会因人为的失误而致使数据丢失,最终决定使用第二种方式来实现数据备份。.net
方案,步骤都已经肯定好以后,还要考虑技术点server
1. 筛选条件的编写
2. 备份字段的对应
3. 托管给计时器任务
4. 发布到SharePoint
5. 激活计时器任务
肯定好方案,步骤,明确好技术点后,接下来就要进行实战演练
1. 打开VS2013 ,点击新建项目
2. 新建完SharePoint 空项目后,在项目下新建类,这个类就是作数据备份功能
3. 引用Microsoft SharePoint.dll,重写类
public class CopyItems:SPJobDefinition
{
public CopyItems()
: base()
{
}
public CopyItems(string jobName, SPService service)
: base(jobName, service, null, SPJobLockType.None)
{
this.Title = "Copy Items";
}
public CopyItems(string jobName, SPWebApplication webapp)
: base(jobName, webapp, null, SPJobLockType.ContentDatabase)
{
this.Title = "Copy Items";
}
public override void Execute(Guid targetInstanceId)
{
//System.Diagnostics.Debugger.Launch();
SPWebApplication webApp = this.Parent as SPWebApplication;
SPSite Site = new SPSite("Http://spserver");
SPWeb Web = Site.OpenWeb("/");
SPList List = Web.Lists["原数据列表"];
SPQuery query = new SPQuery();
query.Query =
@"<Where>
<And>
<Geq>
<FieldRef Name='Age' />
<Value Type='Number'>12</Value>
</Geq>
<Eq>
<FieldRef Name='Sex' />
<Value Type='Choice'>男</Value>
</Eq>
</And>
</Where>";
query.ViewFields = List.DefaultView.ViewFields.SchemaXml;
SPList BakList = Web.Lists["备份数据列表"];
foreach (SPListItem ListItems in List.GetItems(query))
{
SPListItem BakListItems = BakList.Items.Add();
BakListItems["Title"] = ListItems["Title"];
BakListItems["Sex"] = ListItems["Sex"];
BakListItems["Age"] = ListItems["Age"];
BakListItems["Address"] = ListItems["Address"];
BakListItems["Week"] = GetWeekOfYear();
BakListItems.Update();
}
}
private static int GetWeekOfYear()
{
//一.找到第一周的最后一天(先获取1月1日是星期几,从而得知第一周周末是几)
int firstWeekend = 7 - Convert.ToInt32(DateTime.Parse(DateTime.Today.Year + "-1-1").DayOfWeek);
//二.获取今天是一年当中的第几天
int currentDay = DateTime.Today.DayOfYear;
//三.(今天减去 第一周周末)/7 等于 距第一周有多少周 再加上第一周的1 就是今天是今年的第几周了
// 恰好考虑了唯一的特殊状况就是,今天恰好在第一周内,那么距第一周就是0 再加上第一周的1 最后仍是1
return Convert.ToInt32(Math.Ceiling((currentDay - firstWeekend) / 7.0)) + 1;
}
}
4. SharePoint 列表查询语句比较难写,这里能够引用一个工具帮助生成列表的查询语句
5. 键入SharePoint地址后,右侧根据当前登陆名的权限筛选出全部的列表信息。这里选择”原数据列表”
6. 软件中间部位显示出了当前列表的全部字段,根据不一样字段的筛选条件,能够查询到须要到的数据
选中age,选中where,筛选出条件大于12岁的,点击右侧的>按钮
选择sex ,勾选中where,选择and 或or条件,筛选出性别等于男的,点击右侧按钮
点击Test 按钮,下面的结果集就筛选出了年龄大于或等于12岁,性别为男的数据
点击左侧的Editor 按钮,能够查看到当前的结果集的查询语句。
7. 有了查询语句后,编写好类,接下来要托管到计时器任务,点击Feature,添加功能
8. 重命名后,为部署的Feature也从新命名,选择部署范围
在当前Feature 下按F4 在属性里面找到默认激活,选择False
9. 点击刚添加的Feature ,添加事件接收器
10. 在事件接收器的代码中,能够看到不少方法,从新定义一下
1方法是当Feature激活发生的事件
2方法包括建立一个计时器任务及删除一个已存在的计时器任务
3方法表示,当Feature被停用时发生的事件
完整代码以下:
public class ItemsBakEventReceiver : SPFeatureReceiver
{
const string JobName = "Copy Task";
// 取消对如下方法的注释,以便处理激活某个功能后引起的事件。
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
SPSite site = properties.Feature.Parent as SPSite;
DeleteExistingJob(JobName, parentWebApp);
CreateJob(parentWebApp);
});
}
catch (Exception ex)
{
throw ex;
}
}
private bool CreateJob(SPWebApplication site)
{
bool jobCreated = false;
try
{
CopyItems job = new CopyItems(JobName, site);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 1;
job.Schedule = schedule;
job.Update();
}
catch (Exception)
{
return jobCreated;
}
return jobCreated;
}
public bool DeleteExistingJob(string jobName, SPWebApplication site)
{
bool jobDeleted = false;
try
{
foreach (SPJobDefinition job in site.JobDefinitions)
{
if (job.Name == jobName)
{
job.Delete();
jobDeleted = true;
}
}
}
catch (Exception)
{
return jobDeleted;
}
return jobDeleted;
}
// 取消对如下方法的注释,以便处理在停用某个功能前引起的事件。
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
lock (this)
{
try
{
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPWebApplication parentWebApp = (SPWebApplication)properties.Feature.Parent;
foreach (SPJobDefinition job in parentWebApp.JobDefinitions)
{
if (job.Name == JobName)
{
job.Delete();
}
}
});
}
catch (Exception ex)
{
throw ex;
}
}
}
// 取消对如下方法的注释,以便处理在安装某个功能后引起的事件。
//public override void FeatureInstalled(SPFeatureReceiverProperties properties)
//{
//}
// 取消对如下方法的注释,以便处理在卸载某个功能前引起的事件。
//public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
//{
//}
// 取消对如下方法的注释,以便处理在升级某个功能时引起的事件。
//public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
//{
//}
}
11. 代码所有完成后,部署该solution(解决方案)
12. 部署完成后到SharePoint 管理中心查看是否部署成功
能够看到solution已经部署成功了
13. 点击应用程序管理,管理web应用程序,选择要激活的网站集,点击管理功能,能够看到咱们部署的feature,点击激活
14. 点击监控,复查做业定义,找到计时器任务
编辑计时器做业,为了当即看到效果,选择每分钟执行,点击启用
15. 点击做业历史记录,能够查看到做业的运行状态
16. 回到网站,查看备份的列表
数据已经按照筛选条件”年龄大于12岁,性别为男“筛选数据备份到备份数据列表了。