SharePoint 2013 TimeJob简单应用

在SharePoint 周报功能开发中,遇到一个需求,要求能定时备份列表的数据。

明确需求后需要考虑如何实现功能,备份步骤如下

1. 筛选数据

2. 复制数据

3. 新增到备份列表

我们可以用代码实现数据的备份,然而要考虑的是如何启动这个开关。有两种思路

1. 添加Ribbon 按钮手动控制备份,在列表选中相对应的数据,点击Ribbon按钮进行备份

2. 新增一个计时器任务(TimeJob),按需求筛选符合条件的数据,新增到备份列表中,代码托管给计时器任务,可以实现定时备份的功能

考虑到ribbon按钮的权限问题,及手动筛选数据,手动备份会因人为的失误而导致数据丢失,最终决定使用第二种方式来实现数据备份。

方案,步骤都已经确定好之后,还要考虑技术点

1. 筛选条件的编写

2. 备份字段的对应

3. 托管给计时器任务

4. 发布到SharePoint

5. **计时器任务

确定好方案,步骤,明确好技术点后,接下来就要进行实战演练

1. 打开VS2013 ,点击新建项目

SharePoint 2013 TimeJob简单应用

2. 新建完SharePoint 空项目后,在项目下新建类,这个类就是做数据备份功能

SharePoint 2013 TimeJob简单应用

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 列表查询语句比较难写,这里可以引用一个工具帮助生成列表的查询语句

SharePoint 2013 TimeJob简单应用

5. 键入SharePoint地址后,右侧根据当前登录名的权限筛选出所有的列表信息。这里选择”原数据列表”

SharePoint 2013 TimeJob简单应用

6. 软件中间部位显示出了当前列表的所有字段,根据不同字段的筛选条件,可以查询到需要到的数据

SharePoint 2013 TimeJob简单应用

选中age,选中where,筛选出条件大于12岁的,点击右侧的>按钮

SharePoint 2013 TimeJob简单应用

选择sex ,勾选中where,选择and 或or条件,筛选出性别等于男的,点击右侧按钮

SharePoint 2013 TimeJob简单应用

点击Test 按钮,下面的结果集就筛选出了年龄大于或等于12岁,性别为男的数据

SharePoint 2013 TimeJob简单应用

点击左侧的Editor 按钮,可以查看到当前的结果集的查询语句。

7. 有了查询语句后,编写好类,接下来要托管到计时器任务,点击Feature,添加功能

SharePoint 2013 TimeJob简单应用

8. 重命名后,为部署的Feature也重新命名,选择部署范围

SharePoint 2013 TimeJob简单应用

SharePoint 2013 TimeJob简单应用

在当前Feature 下按F4 在属性里面找到默认**,选择False

9. 点击刚添加的Feature ,添加事件接收器

SharePoint 2013 TimeJob简单应用

10. 在事件接收器的代码中,可以看到很多方法,重新定义一下

SharePoint 2013 TimeJob简单应用

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(解决方案)

SharePoint 2013 TimeJob简单应用

12. 部署完成后到SharePoint 管理中心查看是否部署成功

SharePoint 2013 TimeJob简单应用

SharePoint 2013 TimeJob简单应用

可以看到solution已经部署成功了

13. 点击应用程序管理,管理web应用程序,选择要**的网站集,点击管理功能,可以看到我们部署的feature,点击**

SharePoint 2013 TimeJob简单应用

14. 点击监控,复查作业定义,找到计时器任务

SharePoint 2013 TimeJob简单应用

SharePoint 2013 TimeJob简单应用

编辑计时器作业,为了立即看到效果,选择每分钟执行,点击启用

15. 点击作业历史记录,可以查看到作业的运行状态

SharePoint 2013 TimeJob简单应用

16. 回到网站,查看备份的列表

SharePoint 2013 TimeJob简单应用

数据已经按照筛选条件”年龄大于12岁,性别为男“筛选数据备份到备份数据列表了。

转载于:https://my.oschina.net/SaberL/blog/346414