SharePoint 2013 TimeJob简单应用

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

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

1. 筛选数据

2. 复制数据

3. 新增到备份列表

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

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

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

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

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

1. 筛选条件的编写

2. 备份字段的对应

3. 托管给计时器任务

4. 发布到SharePoint

5. 激活计时器任务

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

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

clip_image002

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

clip_image003

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

clip_image005

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

clip_image007

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

clip_image009

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

clip_image011

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

clip_image013

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

clip_image015

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

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

clip_image016

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

clip_image018

clip_image020

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

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

clip_image021

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

clip_image023

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

clip_image024

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

clip_image026

clip_image028

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

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

clip_image030

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

clip_image032

clip_image034

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

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

clip_image036

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

clip_image037

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值